По какой-то причине, когда элементы передаются в массив в функции события FileReader.onload, элементы этого массива позже недоступны. Рассмотрим следующий код:Почему не удается получить доступ к элементам массива? (javascript)
scope.targets = [];
for(var i = 0; i < files.length; i++){
var reader = new FileReader();
reader.readAsDataURL(files[i]);
reader.onload = function(e){
scope.targets.push(e.target.result);
};
}
console.log(scope.targets);
console.log(scope.targets[0]);
Это результат выходов console.log() в браузере Google Chrome. Как вы видите, scope.targets показывает, что существует элемент типа string. Однако scope.targets [0] не определен. Почему это происходит? Есть ли другой способ доступа к элементу?
************************** UPDATE *********** **************************
Вот решение. Спасибо вам, Ashwin Balamohan и nnnnn за ваши ответы, это заставило меня найти решение. Я нашел то, что искал здесь How to implement Progress Bar and Callbacks with async nature of the FileReader
Решение является:
scope.targets = [];
for(var i = 0; i < files.length; i++){
var reader = new FileReader();
reader.readAsDataURL(files[i]);
reader.onload = function(e){
scope.targets.push(e.target.result);
if(i == files.length){
callback();
}
};
}
var callback = function(){
console.log("scope.targets:");
console.log(scope.targets);
console.log("scope.targets[0]:");
console.log(scope.targets[0]);
}
в связи с характером вашего запроса, мы не можем воспроизвести это без труда. вам было бы лучше сделать jsFiddle или что-то, что мы можем использовать, чтобы увидеть проблему. –
Массив заполняется внутри функции, которая запускается асинхронно, а операторы 'console.log()' выполняются до того, как это произойдет. В зависимости от используемого браузера консоль может хранить ссылку на объект, который регистрируется таким образом, что к тому времени, когда вы развернете массив в консоли, в нем есть значения, даже если он был пуст при регистрации. Попробуйте сказать 'console.log (JSON.stringify (scope.targets))' в той же точке и посмотреть, что произойдет. – nnnnnn