Javascript 如何中止提取请求?
我一直在用新的而不是旧的 这是伟大的,但我错过了一个关键的功能 我找不到有关该功能的任何信息 谢谢 更新: 中止提取的黑客解决方法 基本上,您可以在web worker中启动提取,然后取消web worker以中止提取这仍然是一个悬而未决的问题 所有相关的讨论都可以在这里找到Javascript 如何中止提取请求?,javascript,ecmascript-6,Javascript,Ecmascript 6,我一直在用新的而不是旧的 这是伟大的,但我错过了一个关键的功能 我找不到有关该功能的任何信息 谢谢 更新: 中止提取的黑客解决方法 基本上,您可以在web worker中启动提取,然后取消web worker以中止提取这仍然是一个悬而未决的问题 所有相关的讨论都可以在这里找到 :(可以通过中止控制器中止提取: export function cancelableFetch(reqInfo, reqInit) { var abortController = new AbortControll
:(可以通过中止控制器中止提取:
export function cancelableFetch(reqInfo, reqInit) {
var abortController = new AbortController();
var signal = abortController.signal;
var cancel = abortController.abort.bind(abortController);
var wrapResult = function (result) {
if (result instanceof Promise) {
var promise = result;
promise.then = function (onfulfilled, onrejected) {
var nativeThenResult = Object.getPrototypeOf(this).then.call(this, onfulfilled, onrejected);
return wrapResult(nativeThenResult);
}
promise.cancel = cancel;
}
return result;
}
var req = window.fetch(reqInfo, Object.assign({signal: signal}, reqInit));
return wrapResult(req);
}
用法示例:
var req = cancelableFetch("/api/config")
.then(res => res.json())
.catch(err => {
if (err.code === DOMException.ABORT_ERR) {
console.log('Request canceled.')
}
else {
// handle error
}
});
setTimeout(() => req.cancel(), 2000);
链接:
var req = cancelableFetch("/api/config")
.then(res => res.json())
.catch(err => {
if (err.code === DOMException.ABORT_ERR) {
console.log('Request canceled.')
}
else {
// handle error
}
});
setTimeout(() => req.cancel(), 2000);
我通常使用类似于@ixrock的东西
// Fetch and return the promise with the abort controller as controller property
function fetchWithController(input, init) {
// create the controller
let controller = new AbortController()
// use the signal to hookup the controller to the fetch request
let signal = controller.signal
// extend arguments
init = Object.assign({signal}, init)
// call the fetch request
let promise = fetch(input, init)
// attach the controller
promise.controller = controller
return promise
}
然后用
let promise = fetchWithController('/')
promise.controller.abort()
这是因为您无法取消提取:(请参阅:如果您真的需要中止请求,请坚持使用Xhr可能重复的解决方法似乎有些过分,我最好填充提取,然后添加缺少的功能从Google的开发人员站点:感谢更新!尽管这意味着您需要为要中止的每个提取创建并保留一个AbortController(如果您可以中止一组获取,那么您将需要更少的时间)并在每次获取后销毁相应的已保存控制器-这绝非完美的解决方案,但比解决方法要好