可以使用Fetch API作为请求拦截器吗?

时间:2017-03-03 12:05:25

标签: javascript xmlhttprequest fetch-api

我试图在使用Fetch API向服务器发出每个请求后运行一些简单的JS函数。我已经搜索了这个问题的答案,但是没有找到任何答案,可能是因为Fetch API是相对较新的。

我一直用XMLHttpRequest这样做:

(function () {
   var origOpen = XMLHttpRequest.prototype.open;
   XMLHttpRequest.prototype.open = function () {
      this.addEventListener('load', function () {

         someFunctionToDoSomething();   

       });
       origOpen.apply(this, arguments);
    };
})();

很高兴知道是否有办法使用Fetch API完成同样的全局事务。

2 个答案:

答案 0 :(得分:9)

由于fetch会返回一个承诺,您可以通过覆盖fetch将自己插入承诺链中:

(function () {
    var originalFetch = fetch;
    fetch = function() {
        return originalFetch.apply(this, arguments).then(function(data) {
            someFunctionToDoSomething();
            return data;
        });
    };
})();

Example on jsFiddle (因为Stack Snippets不具备方便的ajax功能)

答案 1 :(得分:4)

就像您可以覆盖open方法一样,您也可以使用拦截方法覆盖全局fetch方法:

fetch = (function (origFetch) {
    return function myFetch(req) {
        var result = origFetch.apply(this, arguments);
        result.then(someFunctionToDoSomething);
        return result; // or return the result of the `then` call
    };
})(fetch);