尝试从云存储获取downloadURL时有多个承诺的问题

问题描述 投票:0回答:1

因此,我试图做的是将多个promise(我正在上传的文件)中的每个downloadURL存储在一个数组中,同时循环遍历它们。发生了什么事,无论我得到多少个项目,我都会获得每个项目的第一个输出,它只会一直为我提供来自第一个承诺的第一个downloadURL。

如果我能以某种方式标记每个诺言,以使它们不会彼此重叠,并且为每个文件给我相同的值,或者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);
    })
  }
angular typescript promise firebase-storage angular-promise
1个回答
0
投票

您可以使用RxJS将您的Promises变成Observable,并使用forkJoin等待它们中的每一个完成。

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
© www.soinside.com 2019 - 2024. All rights reserved.