Undefined при попытке вывести элемент массива (FileReader) [дубликат]

200
10 августа 2021, 14:30
На этот вопрос уже даны ответы здесь:
Как вернуть значение из события или из функции обратного вызова? Или хотя бы дождаться их окончания (3 ответа)
Закрыт 1 год назад.

При попытке вывести любой элемент массива получаю undefined, однако если вывести весь массив через console.log, то он выводится.

showFiles = function(files) {
        let resultArray = [];
        for (let i = 0; i < files.length; i++) {
            (function(file) {
                let fr = new FileReader();
                fr.onload = function(e) {
                    let image = new Image();
                    image.src = e.target.result;
                    image.onload = function() {
                        resultArray.push({
                            'src' : e.target.result,
                            'width' : this.width,
                            'height' : this.height,
                            'size' : file.size
                        });
                    }
                };
                fr.readAsDataURL(file);
            })(files[i]);
        }
        console.log(resultArray[0]);

    };
Answer 1

Вариант с использованием промисов и async\await.

async function showFiles(files) { 
  let resultArray = []; 
 
  for (let i = 0; i < files.length; i++) { 
    const file = files[i]; 
    let fr = new FileReader(); 
    const onload = new Promise((resolve, reject) => { 
      fr.onload = function(e) { 
        let image = new Image(); 
        image.src = e.target.result; 
 
        image.onload = function() { 
          resultArray.push({ 
            'src': e.target.result, 
            'width': this.width, 
            'height': this.height, 
            'size': file.size 
          }); 
          resolve(); 
        } 
 
        image.onerror = reject; 
      }; 
      fr.onerror = reject; 
    }); 
    fr.readAsDataURL(file); 
    await onload; 
  } 
  return resultArray; 
}; 
 
async function fileChange() { 
  const res = await showFiles(inputFile.files); 
  console.log(res); 
};
<input id="inputFile" type="file" multiple="true" onchange="fileChange()">

READ ALSO
Работа с двусвязным списком на C++, классы

Работа с двусвязным списком на C++, классы

Нужно создать двусвязный список и проделать с ним некоторые действия - a) Добавить новый элемент в начало, b) Убрать первый элемент, c) Добавить...

217
Множественное обьявление

Множественное обьявление

Вот, что выдает компилятор, все функции и переменные объявлены один раз

99
Какая разница между a.b и a-&gt;b?

Какая разница между a.b и a->b?

У меня есть код, с двумя вариантами, первый который работает с оператором afirst и второй который работает с оператором a->first для меня разницы...

253
Конфликт обьявлений mySQL connector + C++

Конфликт обьявлений mySQL connector + C++

Пытаюсь использовать коннектер MySQL и C++ среда : Windows 10 Code::Blocks 1712 MySQL 8

346