Angular 取消订阅Rxjs finalize操作员

Angular 取消订阅Rxjs finalize操作员,angular,typescript,ionic-framework,rxjs,firebase-storage,Angular,Typescript,Ionic Framework,Rxjs,Firebase Storage,问:我有一个问题最终确定操作符在源完成或完成可观察对象时被调用。这是清楚的。但我们如何预测它不会因为可观测源的变化而再次发出值呢?或者,finalize将在完成第一次发射后终止原始可观测对象。i、 e.不再有来自源的发射,如take(1) 我使用下载Url。我需要在observable返回URL后完成它。我该怎么做?i、 e.无需在此处取消订阅 这是有效的还是更好的方法?如何在获取下载URL后自动取消订阅 afUploadTask.snapshotChanges().pipe(take

问:我有一个问题<代码>最终确定操作符在源完成或完成可观察对象时被调用。这是清楚的。但我们如何预测它不会因为可观测源的变化而再次发出值呢?或者,
finalize
将在完成第一次发射后终止原始可观测对象。i、 e.不再有来自源的发射,如
take(1)

我使用下载Url。我需要在observable返回URL后完成它。我该怎么做?i、 e.无需在此处取消订阅

这是有效的还是更好的方法?如何在获取下载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可用之前提前完成。您不必担心取消订阅,因为上传完成后,可观察对象将完成。一个完整的observable不会阻止垃圾收集或导致内存泄漏。

我希望我需要使用
finalize
无论如何,因为官方文件给出了这种方式。请看这里:这里的关键是我需要一个可下载的网址在这里。没有它就没有意义。好吧。。。我认为你的想法是错误的,为什么你要添加
take(1)
是的,这就是问题所在。我想在这里有一个更好的方式来自动取消订阅。否则,内存泄漏等。内存泄漏与完成观察无关。完成相当于取消订阅。如果finalize运行或completion处理程序运行,则observable完成并符合垃圾收集的条件