【发布时间】:2020-08-19 00:04:05
【问题描述】:
在finalize() 操作符中使用自己的订阅执行另一个 observable 真的很好吗?
我知道,将其放入 subscribe() 不是一个好习惯,这会导致内存泄漏等。我目前正在使用 Firebase Storage API 并尝试将图像上传到数据库,当你无法获得正确的上传状态。因此,我试图了解,当我可以从数据库中获取图像的 URL 时,作为响应,传输的字节数等于总字节数。但 Firebase 对此作出回应,我的图像在服务器上尚不存在。
所以我必须在 finalize() 运算符中获取图像 URL。这真的是个好主意吗?
另外,可以使用debounceTime() 来实现,但我想让代码更加清晰和同步。
另外,搜索了不同的解决方案,发现了一些文章,作者做了同样的事情
this.storage.upload(filePath, this.selectedImage).snapshotChanges()
.pipe(
rxFilter(res => res.bytesTransferred === res.totalBytes),
switchMap(res => this.storage.ref(filePath).getDownloadURL())
)
.subscribe(url => {
console.log(url);
});
【问题讨论】:
-
有一些机制可以组合 observables,例如
forkJoin。您也可以在请求完成后.pipe进行回调。 -
@amphetamachine 我需要在上传图片后准确获取 URL。不幸的是,我无法获得正确的上传状态,我试图通过比较传输的字节量来了解上传是否完成,但在这种情况下,Firebase 仍然会响应错误
-
请贴出有问题的代码。
-
代码对我来说看起来不错。它会起作用,而且我没有看到其他方法。
-
@amphetamachine,是的,此代码有效。问题是这种做法是否与将带有订阅的新 Observable 放在第一个订阅中一样糟糕(内存泄漏、回调地狱等),或者不是
标签: angular typescript rxjs firebase-storage