Angular 从finalize方法返回一个可观察的
具体情况如下: AngularFirebase文档指出,为了从上传的文件中获取下载URL,您需要执行以下操作:Angular 从finalize方法返回一个可观察的,angular,firebase,rxjs,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.downlo
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方法,我想从中返回一个可观察的字符串。我的方法签名如下所示:
upload(file :File) :Observable<string> {
......
}
上传(文件:文件):可观察{
......
}
我试着这样做:
return <Observable<string>>task.snapshotChanges().pipe(
finalize(() => {
const url = fileRef.getDownloadURL();
console.log('download url is ',url);
return url;
})
);
返回任务.snapshotChanges().pipe(
完成(()=>{
const url=fileRef.getDownloadURL();
log('下载url为',url);
返回url;
})
);
但这不起作用,因为在原始可观察对象中还有快照类型的其他元素更改
现在我的问题是,如何使用示例中的代码有效地返回我想要的类型,如文档中所述,
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;
})
);
返回任务.snapshotChanges().pipe(
最后(),
地图(()=>{
const url=fileRef.getDownloadURL();
log('下载url为',url);
返回url;
})
);
我也有同样的问题,这是我的解决方案
return <Observable<string>>task
.snapshotChanges()
.pipe(
last(),
flatMap(
() => {
return fileRef.getDownloadURL().pipe(
map((url) => {
return url;
})
);
}
)
);
返回任务
.snapshotChanges()
.烟斗(
最后(),
平面图(
() => {
返回fileRef.getDownloadURL()管道(
地图((url)=>{
返回url;
})
);
}
)
);
只需删除订阅
,然后返回不起作用的内容。我更新了问题对不起,我的错。添加(在完成之后)映射(()=>fileRef.getDownloadURL())
。不确定从何处获取fileRef
,但map
函数将转换触发次数过多的ObservableThat发出的值。这很管用,但很糟糕,这很好,而且几乎管用,除了fileRef.getDownloadURL()
本身返回一个可观察的值!所以它最终是可维护的好吧,这应该没有问题;只需将map
替换为mergeMap
;-)好主意,但要小心,如果您的源observable尚未发出值,它会抛出错误!很酷,谢谢。但对最后一个有点怀疑。rxjs如何知道last
实际上是last
?它是否基于观察者的完整的方法?欢迎使用。虽然这段代码片段可能是解决方案,但包含解释确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。请查看更多详细信息。