您将如何 Hook 所有使用 Fetch Api 的 AJAX 请求?以前我们可以做这样的事情来 Hook 所有 XMLHttpRequest:
(function() {
var origOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function() {
console.log('request started!');
this.addEventListener('load', function() {
console.log('request completed!');
console.log(this.readyState); //will always be 4 (ajax is completed successfully)
console.log(this.responseText); //whatever the response was
});
origOpen.apply(this, arguments);
};
})();
或者更好的是,如果您想添加到上述功能,您将如何 Hook 所有 Fetch Api 和所有 XMLHttpRequest AJAX 请求?
最佳答案
由于 promise 的性质,这很容易做到:
var taperFunction = response => response;
var originalFetch = fetch;
fetch = (input, init) => originalFetch(input, init)
.then(response => new Promise((resolve) => {
resolve(taperFunction(response));
}));
还有一点更复杂(明确)的例子:
var originalFetch = fetch;
fetch = (input, init) => {
debugger; // do what ever you want with request or reject it immediately
return originalFetch(input, init).then(response => {
// it is not important to create new Promise in ctor, we can await existing one, then wrap result into new one
return new Promise((resolve) => {
response.clone() // we can invoke `json()` only once, but clone do the trick
.json()
.then(json => {
debugger; // do what ever you want with response, even `resolve(new Response(body, options));`
resolve(response);
});
});
});
};
关于javascript - Hook 所有 Fetch Api AJAX 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44728723/