取消订阅 Rxjs 最终运算符



问:我这里有一个问题。 当源完成或完成可观察量时,已调用finalize运算符。这一点很清楚。但是我们如何预测它是否会由于可观察源的变化而再次发出值?或者finalize将在完成第一次发射后终止原始可观察量。即不再像take(1)那样从源头发出.

我使用AngularFireStorage模块下载Url。我需要在返回 URL 后完成可观察量。我该怎么做?即无需在此处取消订阅。

这会起作用还是更好的方法?获取下载网址后如何自动退订?

afUploadTask.snapshotChanges().pipe(take(1), finalize(() => this.downloadURL 
= afStorageReference.getDownloadURL())).subscribe();

这是文档中的原始示例:

task.snapshotChanges().pipe(
finalize(() => this.downloadURL = fileRef.getDownloadURL() )
)
.subscribe()

您的目标是等待上传任务完成,然后设置 URL。 您可以完全按照示例中的操作或如下所示:

afUploadTask.snapshotChanges().subscribe(
null,
null,
() => this.downloadURL = afStorageReference.getDownloadURL()
);

这也将是等效的:

afUploadTask.snapshotChanges().pipe(last()).subscribe(
() => this.downloadURL = afStorageReference.getDownloadURL()
);

添加take运算符将导致在 URL 可用之前过早完成。您无需担心取消订阅,因为上传完成后,可观察量将完成。已完成的可观察量不会阻止垃圾回收或导致内存泄漏。

最新更新