【问题标题】:Deferred objects in a loop循环中的延迟对象
【发布时间】:2014-04-23 07:10:25
【问题描述】:

我有一个 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 指向数组[i]。

此时我尝试获取i的值,发现总是超过数组长度限制。我认为这是因为在解决 dfd 时,循环已达到其最大计数,然后它试图使数组对象超出其限制,这显然是未定义的。

这种情况有什么解决方法吗?我只需要按照数据出现的顺序处理数组对象。

【问题讨论】:

标签: javascript jquery arrays jquery-deferred


【解决方案1】:

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

尝试使用$.each() 遍历数组

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

【讨论】:

  • 在回调中创建了一个新的闭包,但您的方法似乎更加优雅。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多