【问题标题】:Destroying a merge() operator subscription? [duplicate]销毁 merge() 运算符订阅? [复制]
【发布时间】:2019-12-08 01:23:39
【问题描述】:

In this article a merge 运算符用于订阅排序和分页事件。函数如下所示:

    merge(this.sort.sortChange, this.paginator.page)
        .pipe(
            tap(() => this.loadLessonsPage())
        )
        .subscribe();

我们是否需要在组件销毁时保持订阅并调用取消订阅?

【问题讨论】:

标签: javascript angular typescript rxjs angular-material


【解决方案1】:

简短回答:是的!

更多扩展答案:您不必手动操作!

您可以使用大量的operators 来帮助您管理订阅。完全不管理订阅的更好方法是让您的 HTML 使用 AsyncPipe 为您完成。

例子:

component

this.sortAndPaging = merge(this.sort.sortChange, this.paginator.page)
        .pipe(
            tap(() => this.loadLessonsPage())
        )
html

<div *ngIf="sortAndPaging | async as sortAndPaginaData">
 {{ sortAndPagingData | json }}
</div>

这样,Angular 的生命周期管理结合AsyncPipe 将跟踪和订阅/取消订阅本身。

正如我之前提到的,另一个强大的解决方案是使用operators 来执行此操作。 RxJS 附带了许多强大的工具,例如 first()take(x)takeUntil()takeWhile(),它们会自动为您完成和取消订阅。

take(10) 将在例如通过 10 个值后完成并取消订阅。

针对您的情况的更具体的提示将需要一个更广泛的问题和一些您尝试过的示例。

【讨论】:

  • 那么它会以某种方式自动完成吗?
  • 这应该是一个评论,伙计:)
  • 但我认为我们至少需要这样的东西并实现OnDestroy?
  • 我建议使用takeUntil 方法(如果你不能使用async 管道),并有一个Subject,它只在ngOnDestroy 中发出。这使您免于拥有一千个订阅变量:ngOnDestroy() { this.destroy$.next(true); }
猜你喜欢
  • 2014-04-02
  • 2016-12-06
  • 2016-02-02
  • 2013-04-16
  • 2021-02-25
  • 2022-01-18
  • 2021-06-05
  • 2018-10-17
  • 1970-01-01
相关资源
最近更新 更多