我有一系列javascript原型对象。每个对象都有一个数据和一个延迟对象,如下所示:
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()
函数内,我无法使用数据执行任何操作。我经常收到错误消息:chrome控制台中的Uncaught TypeError: Cannot read property 'data' of undefined
指向array [i]。
我试图在此时获取i
的值,以发现它总是超出数组长度限制。我认为这是因为在dfd
被解析的时候,循环已达到其最大计数,然后它试图使数组对象超出其限制,这显然是未定义的。
此方案有解决方法吗?我只需要按照数据出现的顺序处理数组对象。
答案 0 :(得分:2)
这里的问题是closure variable in a loop的错误用法,上面的评论显示..
尝试使用$.each()迭代数组
$.each(array, function (i, item) {
item.resetData();
item.dfd.done(function () {
process(item.data);
});
});