我有一个 javascript 原型(prototype)对象数组。每个对象都有一个数据和一个延迟对象,如下所示:
function Obj(data){
this.dfd=$.Deferred();
this.data;
}
我有一个函数可以在某些事件期间重置数据,函数如下。
Obj.prototype.resetData=function(){
var dataFromAjaxCall=//Function containing Ajax calls...Returns data.
this.data=dataFromAjaxCall;
this.dfd.resolve();
}
现在,假设我创建了一个 Obj
类型的对象数组,并将其命名为 array
。我需要一一调用他们并重置他们的数据。其代码如下:
for(var i=0;i<array.length;i++){
array[i].resetData();
array[i].dfd.done(function(){
//Do something with the data
process(array[i].data);
});
}
现在,在 dfd.done()
函数内,我无法使用数据执行任何操作。我经常收到错误消息:Uncaught TypeError: Cannot read property 'data' of undefined
in chrome console pointing to array[i].
此时我试图获取i
的值,发现它总是超出数组长度限制。我认为这是因为当 dfd 被解析时,循环已达到其最大计数,然后它尝试使数组对象超出其限制,这显然会显示为未定义。
对于这种情况有什么解决方法吗?我只需要按照数据出现的顺序处理数组对象。
最佳答案
这里的问题是 closure variable in a loop 的错误使用,上面的评论显示..
尝试使用$.each()迭代数组
$.each(array, function (i, item) {
item.resetData();
item.dfd.done(function () {
process(item.data);
});
});
关于javascript - 循环中的延迟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23237297/