jqXHR对象从数组中删除自身和容器

时间:2013-09-03 17:14:14

标签: javascript jquery ajax

我将jquery ajax对象存储在一个数组中,这样我就可以根据用户触发的事件手动取消该调用(如果尚未返回)。这些是我期望长时间运行的ajax调用。

的JavaScript

var ajaxCalls = [];
ajaxCalls[0] = $.ajax({...});

$("#cancelButton").on("click", function() { ajaxCalls[0].abort(); });

存在的问题是在调用abort()方法后jqXHR对象从数组中消失。

现在,在管理对象的内存时,这看起来很棒,因为它可以神奇地移除自身并清理干净。但是,它在我的代码中留下了一个反模式,看起来我自己没有清理。它也违背了我为add方法创建删除伴随方法的目的。

这有什么理由吗?如果我的数组包含多于1个对象,则它会完全适当地重新调整大小。

这个数组如果字母是jqXHR对象

['a', 'b', 'c', 'd']

当jqXHR对象'b'完成

时变为此数组
['a', 'c', 'd']

阅读代码,可以预期会发生这种情况

['a', null/undefined, 'c', 'd']

为什么?

修改

这是一个小提琴,我能够重现我正在做的事情。

作为直接数组元素:

[ jqXHR, jqXHR, jqXHR ]

http://jsfiddle.net/itanex/uHX8q/

作为数组中的键值对象元素:

[ { key: "key", value: jqXHR }, { key: "key", value: jqXHR } ]

http://jsfiddle.net/itanex/7DSrg/

1 个答案:

答案 0 :(得分:2)

当您中止呼叫时,complete回调会运行。所以这发生了:

ajaxCalls.pop();

然后是你的jqXHR对象。

添加console.log以显示pop

http://jsfiddle.net/ycpZc/