Jquery 中止所有ajax请求

Jquery 中止所有ajax请求,jquery,ajax,Jquery,Ajax,我已经实现了通常的AJAX池,但是当我中止所有请求时,它会以2个请求的增量中止它们,即第一、第三、第五。。。 我基本上就是这样做的: $.ajaxSetup({ 发送前:函数(jqXHR,设置){ $.xhrPool.push(jqXHR); }, 完成:函数(jqXHR,文本){ //从阵列中删除已完成的请求 var指数=$.xhrPool.indexOf(jqXHR); 如果(索引>-1){ $.xhrPool.splice(索引,1); } }, 错误:函数(jqXHR、textStatu

我已经实现了通常的AJAX池,但是当我中止所有请求时,它会以2个请求的增量中止它们,即第一、第三、第五。。。 我基本上就是这样做的:

$.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()
。明白了,你说得对,我明白你现在说的了。您可能应该包含一个编码的答案来解决这个问题