@bugagashnik

Как получить значение base64 url снаружи функции onloadend?

Есть массив объектов blob responseArray. Нужно получить base64 url с каждого blob и записать в массив finalScreenshotsArray

let finalScreenshotsArray = []
    
          responseArray.map(blob=> {
            var reader = new FileReader();
            reader.readAsDataURL(blob);
            reader.onloadend = function() {
              let base64data = reader.result;
              finalScreenshotsArray.push(base64data)
    
    
            }
          })


Однако внутри функции работает только console.log(base64data), но в массив не пишется. Как получить доступ к этой переменной снаружи?
  • Вопрос задан
  • 118 просмотров
Решения вопроса 1
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
У вас вызов reader.onloadend = function() {...} является асинхронным. Поэтому, в момент вызова console.log() вне responseArray.map(blob=> {...}) массив finalScreenshotsArray все еще пуст.

попробуйте сделать так (пример очень грубый, но для идентификации проблемы вполне годен):
let finalScreenshotsArray = [];

responseArray.forEach(blob=> {
  let reader = new FileReader();
  reader.readAsDataURL(blob);
  let promise = new Promise((resolve, reject) => {
    reader.onloadend = function() {
      resolve(reader.result);
    }
  });
  finalScreenshotsArray.push(promise);
});

Promise.all(finalScreenshotsArray)
.then(results => {
  console.log(results);
});


ЗЫ: код не проверял, на телефоне это достаточно проблематично.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@gribanov2la
Full stack web разработчик
Абстрагируясь от ньансов, можно сказать, что всё должно работать, т.к. finalScreenshotsArray достается из замыкания (вверх по скоупам). Пример на любом sandbox поможет решению проблемы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы