Jquery 中止所有ajax请求
我已经实现了通常的AJAX池,但是当我中止所有请求时,它会以2个请求的增量中止它们,即第一、第三、第五。。。 我基本上就是这样做的:Jquery 中止所有ajax请求,jquery,ajax,Jquery,Ajax,我已经实现了通常的AJAX池,但是当我中止所有请求时,它会以2个请求的增量中止它们,即第一、第三、第五。。。 我基本上就是这样做的: $.ajaxSetup({ 发送前:函数(jqXHR,设置){ $.xhrPool.push(jqXHR); }, 完成:函数(jqXHR,文本){ //从阵列中删除已完成的请求 var指数=$.xhrPool.indexOf(jqXHR); 如果(索引>-1){ $.xhrPool.splice(索引,1); } }, 错误:函数(jqXHR、textStatu
$.ajaxSetup({
发送前:函数(jqXHR,设置){
$.xhrPool.push(jqXHR);
},
完成:函数(jqXHR,文本){
//从阵列中删除已完成的请求
var指数=$.xhrPool.indexOf(jqXHR);
如果(索引>-1){
$.xhrPool.splice(索引,1);
}
},
错误:函数(jqXHR、textStatus、errorshown){
//从阵列中删除错误请求
var指数=$.xhrPool.indexOf(jqXHR);
如果(索引>-1){
$.xhrPool.splice(索引,1);
}
}
});
函数abortAll(){
$.each($.xhrPool,函数(键,值){
value.abort();
});
}
如果我在$中执行console.log(value)
。每个,其中一些是未定义的。如果在$之前执行console.log($.xhrPool)
。每个,它们看起来都正常
我遗漏了什么?首先,即使在发生错误之后,也会调用complete
,因此,如果执行相同的操作,则不需要同时处理这两个问题
其次,当您中止时,将调用错误
和完成
,以便在迭代初始数组(在$中。每个
)时对其进行更改,这通常是一种错误模式
因此,在您的每个中,您位于第一个元素,您中止它(并更改数组以删除该元素),然后转到索引为2的元素,该元素以前是第三个,但现在是自第一个元素删除以来的第二个元素
Array each index target
[xhr1, xhr2, xhr3, xhr4] 0 xhr1
[xhr2, xhr3, xhr4] 1 xhr3
[xhr3, xhr4] 2 undefined
排列每个索引目标
[xhr1,xhr2,xhr3,xhr4]0 xhr1
[xhr2,xhr3,xhr4]1 xhr3
[xhr3,xhr4]2未定义
基于,实际解决此问题的最佳方法是创建一个新数组以循环:
function abortAll() {
// copying-an-array-of-objects-into-another-array-in-javascript
// https://stackoverflow.com/questions/16232915
var calls = Array.from($.xhrPool);
$.each(calls, function(key, value) {
value.abort();
});
}
当您中止它们时,完整回调和错误回调是否同步发生?我希望不会,但是,也许你可以使用complete来删除这个项目,以保持代码的干性。你是否使用javascript来并行运行多个脚本?如果不是,则在运行时不可能出现错误或完成abortAll@ErikPhilips它们不是并行运行的。在jquery.abort()
方法中调用了.complete()
。明白了,你说得对,我明白你现在说的了。您可能应该包含一个编码的答案来解决这个问题