我现在一直试图拦截取消呼叫 . 我成功拦截了调用,但原来的调用没有执行 . 直到昨天我还不知道fetch是什么,这只是一个漫长的征途,只是弄清楚我听不到$ .ajaxSuccess或XMLHttpRequest .
我究竟做错了什么?我真的不知道承诺如何运作得很好 . 我试过阅读它 .
问题是,我这样做的方法我可以成功读取返回的JSON,但不会传递给原来的调用函数 . (仅供参考我想在调用者函数之后处理数据) . 这是我到目前为止所不知道如何使其工作:
const constantMock = window.fetch;
window.fetch = function() {
return new Promise((resolve, reject) => {
constantMock.apply(this, arguments)
.then((response) => {
resolve(response);
if(response.url.indexOf("/history") === -1 || response.type == "cors")
return;
response.json().then((data) => {
resolve(data);
console.log(data);
});
})
.catch((error) => {
reject(response);
})
});
}
我怎样才能做到这一点?我做错了什么,我该怎么办?
(我无法访问调用者函数,因为我将代码注入浏览器 . )
1 回答
我曾经做过类似的事情,这是我写的模块 .
笔记:
如果您正在拦截
resp.clone()
非常重要 . 响应是一次性使用,因此克隆允许您使用响应并仍然将其返回到原始回调 .恕我直言,更容易返回原始的承诺链,以及你的截取器
.then
当然,并且确保在你为自己的目的克隆它之后返回.then
中的原始响应 .无论如何,这是代码:
我确信很明显,这个模块旨在让你注册一个“回调”函数,以便在每次获取时调用 . 它只能以我编写它的方式进行单次回调,但如果需要多次回调,则可以很容易地将我的单个命名属性更改为数组 . 无论如何,这是一个注册回调的示例: