У меня есть следующий код, который работает в цикле:Передача переменной в асинхронной функции (обещание) в JavaScript
var index = fileNames[x].lastIndexOf("/") + 1;
var currentImageName = fileNames[x].substr(index);
if (currentImageName.indexOf(".jpg") != -1) {
reader.getFileAsBlob(fileNames[x])
.done(function(blob) {
picturesFilePathArray.push({
fileName: currentImageName,
fileURL: blobURL(blob)
});
refreshKMZList();
});
}
Проблема, которую я имею, что я пытаюсь сохранить объект с 2 свойства в массив. Этот объект должен иметь идентификатор и результат. (fileName и fileURL соответственно). Но так как эта функция асинхронна (выполняется через обещание). К тому времени, когда заканчивается «getFileAsBlob», currentImageName уже обновлен, в конечном итоге заканчивается на многих моих объектах, имеющих один и тот же идентификатор (последний обрабатывается до его завершения).
Это может быть очень простая проблема, но я очень новичок в javascript и еще ничего не нашел об этом.
Я думал, что решение может передать переменную функции «done», но я думаю, что эта функция является той, которая возвращается методом и уже установлена. (Я не знаю, как он выглядит)
Edit:
код только внутри нормального цикла
for (x = 0; x<fileNames.length; x++)
Думаю, вам нужно использовать закрытие javascript. Можем ли мы иметь полный код цикла? – BiAiB
Закрытие: http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – MiniGod
Возможный дубликат [Закрытие Javascript внутри петель - простой практический пример] (http://stackoverflow.com/questions/750486/javascript-clos-inside-loops-simple-practice-example) – Barmar