Отложенные объекты в цикле

У меня есть массив 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() функция, я не могу использовать данные для выполнения чего-либо. Я часто получаю сообщение об ошибке: Uncaught TypeError: Cannot read property 'data' of undefined в консоли chrome, указывающей на массив [i].

Я пытался получить значение i на данный момент, чтобы найти, что он всегда превышает предел длины массива. Я думаю это потому что к тому времени dfd разрешен, цикл достиг максимального значения и затем пытается вывести объект массива за пределы своего предела, который, очевидно, становится неопределенным.

Есть ли обходной путь для этого сценария? Мне просто нужно обработать объекты массива в том порядке, в котором данные появляются.

1 ответ

Решение

Проблема здесь заключается в неправильном использовании закрывающей переменной в цикле, как показано в комментариях выше.

Попробуйте использовать $.each() для перебора массива

$.each(array, function (i, item) {
    item.resetData();
    item.dfd.done(function () {
        process(item.data);
    });
});
Другие вопросы по тегам