Проблема с несколькими обещаниями при попытке получить downloadURL из облачного хранилища - PullRequest
0 голосов
/ 16 марта 2020

Итак, что я пытаюсь сделать, это сохранить каждый downloadURL из нескольких обещаний (файлов, которые я загружаю) в массиве, просматривая их. Что происходит, я получаю первый вывод для каждого элемента, независимо от того, сколько элементов я получаю, он просто продолжает давать мне первый downloadURL из первого обещания.

Если бы я мог как-то пометить каждое из обещаний, чтобы они не go над каждым другим и дайте мне одинаковое значение для каждого файла, или myb остановите каждый и дождитесь окончания первого, чтобы начать второй. Первое решение звучит намного лучше для меня, но я до сих пор не знаю, как бы я это сделал.

   pushUpload(upload: Upload) {

    let storageRef = firebase.storage().ref();
    this.uploadTask = storageRef.child(`${this.basePath}/${upload.file.name}`).put(upload.file);

    this.uploadTask.on(firebase.storage.TaskEvent.STATE_CHANGED,
      (snapshot) =>  {
        // upload in progress
        upload.progress = Math.ceil((snapshot.bytesTransferred / snapshot.totalBytes) * 100)
      },
      (error) => {
        // upload failed
        console.log(error)
      },
      () => {
        // upload success
        this.uploadTask.snapshot.ref.getDownloadURL().then((url)=>{
          this.uploadInfo.push(url)
        })
      })
  };
  uploadMultiple() {
    let files = this.selectedFiles
    let filesIndex = _.range(files.length)
    _.each(filesIndex, (idx)=>{
      this.currentUpload = new Upload(files[idx]);
      this.service.pushUpload(this.currentUpload);
    })
  }

1 Ответ

0 голосов
/ 16 марта 2020

Вы можете использовать Rx JS, чтобы превратить свои Обещания в Наблюдаемые, и использовать forkJoin, чтобы дождаться завершения каждого из них.

import { from, forkJoin } from 'rxjs';

let promises = thePromiseArray();
forkJoin(...promises.map(promise => from(promise))).subscribe(
  results => {
    console.log("This is an array of the results of each Promise:", results);
  }
)

Вы также можете использовать pipe для добавления дополнительных операторов ко всем загрузкам или каждой загрузке по отдельности. Например, вы можете использовать timeout, чтобы не ждать дольше, чем некоторое время:

forkJoin(...promises.map(promise => from(promise).pipe(
  timeout(25000) // This is applied to each download individually
))).pipe(
  // Any operators added here would be applied to the forkJoin, so all downloads as a whole
).subscribe(
  results => {
    console.log("This is an array of the results of each Promise:", results);
  }
)
...