2017-03-03 54 views
2

我试图运行一些简单的JS函数后,每个请求到服务器与Fetch API。我已经搜索了这个问题的答案,但还没有找到任何答案,可能是因为Fetch API是相对近期的事实。是否可以使用Fetch API作为请求拦截器?

我一直在XMLHttpRequest像这样的:

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

     someFunctionToDoSomething(); 

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

将是伟大知道是否有使用提取API来完成这同一个世界的事情的方式。

回答

5

由于fetch返回一个承诺,你可以通过重写fetch插入自己的承诺链:

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

Example on jsFiddle(因为堆栈片段没有方便的Ajax特性)

+0

那三个字符的缩进让我吓了一跳:-) – Bergi

+0

@Bergi:我也是,我不得不修复^ H^H^H把它换成小提琴。事实上,我也改变了它,因为我无论如何都不一致地应用它。 (20多年前,我在一家C商店工作,其中3人是标准工作,并且工作得很好,但我转而使用4个人以符合大多数其他商店,现在它只是普通的外国人。) –

+0

真的很抱歉三字符缩进。不会再发生! 关于粗体,对不起。思想会有助于获得问题的关键部分。显然不好的主意。 –

1

刚就像你可以覆盖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);