【发布时间】:2019-09-03 06:37:53
【问题描述】:
以下是来自 MDN 的示例。有两个按钮。一个正在发送请求,另一个正在取消。
var controller = new AbortController();
var signal = controller.signal;
var downloadBtn = document.querySelector('.download');
var abortBtn = document.querySelector('.abort');
downloadBtn.addEventListener('click', fetchVideo);
abortBtn.addEventListener('click', function() {
controller.abort();
console.log('Download aborted');
});
function fetchVideo() {
...
fetch(url, {signal}).then(function(response) {
...
}).catch(function(e) {
reports.textContent = 'Download error: ' + e.message;
})
}
现在我的情况不同了。我有一个 query 参数,如果正在获取但未完成,并且 query 参数发生更改 - 我如何发送一个新请求自动取消之前的请求?
【问题讨论】:
-
你意识到这一点isn't supported on IE right?你的问题到底是什么?有没有办法做到这一点,是的。
-
Edge 上实际上支持 @Liam + IE 有 polyfills npmjs.com/package/abortcontroller-polyfill
-
误读了,锯边,没有在手机上阅读
-
如果
AbortController不可用,那么,明智地使用Promise.race(),您应该能够为自己设计一个可中止的Promise。它与将{signal}传递给fetch()的行为不同,但应用程序代码中的净效应是相同的。 -
@Roamer AbortController 的目标是向 fetch API 提供可取消的请求,这种设计原本就相当复杂;能够停止长时间运行的请求(例如在 MDN 的情况下,视频)。赛车承诺不会帮助中止任何事情。即使他们要求停止下载,您的用户仍将下载整个文件。但是,至少从 XHR2 开始,取消请求是可行的。因此,如果您需要对其进行 polyfill,您只需要返回使用 XHR 并 Promisify 它(需要注意的是,应在请求开始时声明消费者)。
标签: javascript promise fetch