具体情况是这样的: 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;
})
);
但是这不起作用,因为原始可观察对象中还存在其他类型的快照更改元素。
现在的问题是,如何使用示例中的代码有效地返回所需的类型
答案 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;
})
);
}
)
);