循环中的延迟对象

时间:2014-04-23 07:10:25

标签: javascript jquery arrays jquery-deferred

我有一系列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被解析的时候,循环已达到其最大计数,然后它试图使数组对象超出其限制,这显然是未定义的。

此方案有解决方法吗?我只需要按照数据出现的顺序处理数组对象。

1 个答案:

答案 0 :(得分:2)

这里的问题是closure variable in a loop的错误用法,上面的评论显示..

尝试使用$.each()迭代数组

$.each(array, function (i, item) {
    item.resetData();
    item.dfd.done(function () {
        process(item.data);
    });
});