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

的JavaScript

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

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


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

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

是否有一个原因?如果我的数组包含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/

最佳答案

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

ajaxCalls.pop();


还有jqXHR对象。

添加了console.log以显示pop

http://jsfiddle.net/ycpZc/

07-24 09:47
查看更多