为什么forkJoin从我的可观察对象返回错误的值?

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

我有一个使用Firebase Storage发送一些图像数据的应用程序,所以我正在使用此方法:

startUpload() {
    if (typeof this.fileList !== 'undefined' && this.fileList.length > 0) {
      const observableList = [];
      for (let i = 0; i < this.fileList.length; i++) {
        // The storage path
        const path = this.userModel.companyCode + `/${new Date().getTime()}_${this.fileList[i].name}`;

        // Totally optional metadata
        const customMetadata = { app: 'My AngularFire-powered PWA!' };
        const fileRef = this.storage.ref(path);

        // The main task
        this.task = this.storage.upload(path, this.fileList[i], { customMetadata });

        // Progress monitoring
        this.percentage = this.task.percentageChanges();
        this.snapshot = this.task.snapshotChanges();

        // The file's download URL
        observableList.push(
          this.task.snapshotChanges().pipe(
            finalize(async() =>  {
              return await fileRef.getDownloadURL();
          }))
        );

        // observableList = this.task.snapshotChanges();
        // observableList.push(taskObservable);
       }
        console.log(observableList);
        forkJoin(
          observableList
        ).subscribe(
          response => {
            console.log(response);
          }
        );
     }
  }

此部分:

 this.task.snapshotChanges().pipe(
            finalize(async() =>  {
              return await fileRef.getDownloadURL();
          }))

当我单独使用此功能并像这样使用时:

this.task.snapshotChanges().pipe(
                finalize(async() =>  {
                  this.downloadUrl = await fileRef.getDownloadURL().toPromise;
              }))

它们返回正确的URL,this.downloadUrl是一个全局变量,它是downloadURL:Observable;

但是我不想一个一个地返回3个结果,所以我有一个想法要使用forkJoin,就像javascript中的promise中的Promise.All()一样。

  console.log(observableList);
        forkJoin(
          observableList
        ).subscribe(
          response => {
            console.log(response);
          }
        );

而且我正在控制台中得到这个:

(3)[[UploadTaskSnapshot,UploadTaskSnapshot,UploadTaskSnapshot]

如何从他们那里获得下载URL?

我有一个使用Firebase Storage发送一些图像数据的应用程序,所以我正在使用此方法:startUpload(){if(typeof this.fileList!=='undefined'&& this.fileList.length&.. 。

javascript angular firebase firebase-storage
1个回答
0
投票

finalize采用返回类型为void的回调函数。这就是为什么它在您的情况下可以单独处理的原因,而不是在您尝试退回某些东西时起作用的原因。finalize-rxjs

© www.soinside.com 2019 - 2024. All rights reserved.