从可观察的finalize方法返回可观察的

时间:2018-09-22 17:17:11

标签: angular firebase rxjs

具体情况是这样的: AngularFirebase文档说,为了从上传的文件中获取下载URL,您需要执行以下操作:

const task = this.storage.upload(filePath, file);

// observe percentage changes
// get notified when the download URL is available
task.snapshotChanges().pipe(
    finalize(() => this.downloadURL = fileRef.getDownloadURL() )
 )
.subscribe();
}

现在,我有一个上载方法,我想从中返回一个可观察到的字符串。我的方法签名看起来像:

upload(file :File) :Observable<string> {

......

}

我尝试这样做:

return <Observable<string>>task.snapshotChanges().pipe(
        finalize(() => {
            const url = fileRef.getDownloadURL();
            console.log('download url is ',url);
            return url;
        })
    );

但是这不起作用,因为原始可观察对象中还存在其他类型的快照更改元素。

现在的问题是,如何使用示例中的代码有效地返回所需的类型

2 个答案:

答案 0 :(得分:3)

如文档中所述,finalize ...

  

返回与源Observable镜像的Observable,但是当源在完成或错误终止时将调用指定的函数。

这意味着,您不能使用传递的函数来更改Observable类型。

相反,可以将last运算符和map运算符组合在一起,以获取有关映射到所需属性的最后一个值的通知。看起来像这样:

return <Observable<string>>task.snapshotChanges().pipe(
        last(),
        map(() => {
            const url = fileRef.getDownloadURL();
            console.log('download url is ',url);
            return url;
        })
    );

答案 1 :(得分:0)

我有同样的问题,这是我的解决方法

return <Observable<string>>task
      .snapshotChanges()
      .pipe(
        last(),
        flatMap(
          () => {
            return fileRef.getDownloadURL().pipe(
              map((url) => {
                return url;
              })
            );
          }
        )
      );