【问题标题】:unsubscribe to the Rxjs finalize operator取消订阅 Rxjs finalize 操作符
【发布时间】:2020-10-07 12:20:38
【问题描述】:

问:我有一个问题。 finalize 操作符在源完成或完成 Observable 时被调用。这很清楚。但是我们如何预测它不会因为 Source observable 的变化而再次发出值呢?或者finalize 将在完成第一次发射后终止原始 Observable。即不再像take(1) 这样的源发出。

我使用AngularFireStorage module 下载网址。我需要在它返回 URL 后完成 observable。我怎样才能做到这一点?即无需在此处取消订阅。

这会奏效还是更好的方法?获取下载地址后如何自动退订?

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

这是文档中的原始示例:

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

【问题讨论】:

    标签: angular typescript ionic-framework rxjs firebase-storage


    【解决方案1】:

    您的目标是等待上传任务完成,然后设置 url。您可以完全按照示例中的方式进行操作,或者像这样:

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

    这也是等价的:

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

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

    【讨论】:

    • 我希望无论如何我都需要使用finalize,因为官方文档是这样规定的。请看这里:github.com/angular/angularfire/blob/master/docs/storage/…
    • 这里的关键是我需要一个可下载的 URL。没有它毫无意义。
    • 好的...我认为你搞错了,你为什么要添加take(1)
    • 是的,这就是这里的问题。我想在这里有一个更好的方法来自动退订。否则内存泄漏等。
    • 内存泄漏与完成 observables 无关。完成相当于取消订阅。如果 finalize 运行或完成处理程序运行,则 observable 已完成并有资格进行垃圾回收
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2017-03-26
    • 2020-10-28
    • 2021-11-18
    • 1970-01-01
    • 2016-07-07
    • 2018-07-29
    • 2019-03-16
    相关资源
    最近更新 更多