Как вызвать функцию после разархивирования файла и загрузки содержимого в Firestore в угловом режиме? - PullRequest
0 голосов
/ 28 декабря 2018

Я получаю zip-файл с изображениями и csv-файлами от пользователя.Мне нужно распаковать эти файлы и загрузить их в Firestore.Когда я загружаю изображения, я также хочу сохранить путь для загрузки изображения в объект изображения, который я нажимаю позже.Я хочу сохранить идентификаторы всех объектов изображения, которые я нажимаю, и сохранить их в терминальном объекте.Я хочу подождать, пока все мои файлы будут загружены, прежде чем вызывать некоторые другие функции.

Моя функция вызывается непосредственно перед заполнением моего termObj.Я попытался сохранить обещания и подождать, пока все они не разрешатся, но обещание. Все выполняются немедленно (он не ожидает заполнения обещаний в цикле for)

Как мне ждать всех моихфайлы, которые должны быть загружены и имеют заполненный termObj, прежде чем я вызову this.printDone ()?

async fileChanged(event) {
const file = event.target.files[0];
const self = this;
let promises= [];
let termObj = {
  all_images: [],
};

this.zipService.getEntries(file).subscribe( (next) => {

  for (const ent of next) {
    let filename : string = ent.filename;
    const fileType = filename.slice(filename.indexOf("."));
    this.zipService.getData(ent).data.subscribe(async function(val) {

      let blobFile = new File([val], filename);
      self.task =  self.storage.upload(self.authService.getUser() +  "/" +filename, blobFile);


      if( fileType === '.jpg' || fileType === '.jpeg' || fileType === '.png'){
        let pathToFile = self.authService.getUser() + '/' + filename;
        // URL
        await firebase.storage().ref().child( pathToFile ).getDownloadURL().then(function (url) {
          let imageObj = {
            downloadURL: url,
          };
          const imagePromise = self.db.collection('images').add(imageObj).then(function(ref){
            termObj.all_images.push(ref.id);
            console.log(termObj);
          });
          promises.push(imagePromise);
        });
      }
    }); // end of unzip service that gets data from zipped entry
  } // end of for loop looping through files

}); //gets entries from zipped file
await Promise.all(promises).then(()=>{
    this.printDone();
    console.log(termObj.all_images);
});

} // конец метода

============= Редактировать ========== перемещение оператора await Promise.all сразу после окончания цикла for и затем console.log termObj.all_images дает мне тот же результат.

вывод console.log (termObj.all_images)

1 Ответ

0 голосов
/ 28 декабря 2018

Переместите это

await Promise.all(promises).then(()=>{
this.printDone();
console.log(termObj.all_images);});

сразу после закрытия for.

Ваша проблема вызвана тем, что подписка асинхронна (вы уже это знаете) Но это означает, что массив обещанийпусто, когда этот код достигнут.

...