首页 文章

拦截提取呼叫

提问于
浏览
0

我现在一直试图拦截取消呼叫 . 我成功拦截了调用,但原来的调用没有执行 . 直到昨天我还不知道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 回答

  • 2

    我曾经做过类似的事情,这是我写的模块 .

    笔记:

    • 如果您正在拦截 resp.clone() 非常重要 . 响应是一次性使用,因此克隆允许您使用响应并仍然将其返回到原始回调 .

    • 恕我直言,更容易返回原始的承诺链,以及你的截取器 .then 当然,并且确保在你为自己的目的克隆它之后返回 .then 中的原始响应 .

    无论如何,这是代码:

    const fetchSnoop = (callback) => {
      if (typeof window.fetch.qwerCb !== 'undefined')
        window.fetch.qwerCb = callback;
      else {
        var qfetch = window.fetch;
        window.fetch = function (req, init) {
          return qfetch.apply(window, arguments).then(function (resp) {
            if (typeof window.fetch.qwerCb === 'function')
              window.fetch.qwerCb(resp.clone(), req, init);
            return resp;
          });
        };
        window.fetch.qwerCb = callback;
      }
    };
    

    我确信很明显,这个模块旨在让你注册一个“回调”函数,以便在每次获取时调用 . 它只能以我编写它的方式进行单次回调,但如果需要多次回调,则可以很容易地将我的单个命名属性更改为数组 . 无论如何,这是一个注册回调的示例:

    fetchSnoop((resp, req, init) => {
      if (true /* test criteria if you're only looking for particular fetches */)
        resp.json().then(t => {
          console.log('my json', t);
        });
    });
    

相关问题