Отложенные объекты в цикле
У меня есть массив 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);
});
});