【问题标题】:Angular RxJS - Unsubscribe from mergeMap?Angular RxJS - 从mergeMap退订?
【发布时间】:2018-07-31 12:53:32
【问题描述】:

遵循 Stack Overflow 帖子:Angular RxJS When Should I Unsubscribe From Subscription 中描述的最佳实践,考虑这个 Angular 组件生命周期挂钩:

private ngUnsubscribe: Subject<void> = new Subject();

ngOnInit() {
  this.fireAuth.authState
    .takeUntil(this.ngUnsubscribe)
    .mergeMap((user) => this.todoService.getUserTodos(user.uid))
    .takeUntil(this.ngUnsubscribe)
    .subscribe((todos) => this.userTodoArray = todos);
}

ngOnDestroy() {
  this.ngUnsubscribe.next();
  this.ngUnsubscribe.complete();
}

authState()mergeMap() 都返回 Observables,我想我也应该这样做

  1. 同时取消订阅(如上所示)或
  2. 仅调用 takeUntil() 运算符之一,可以从外部 Observable authState() 或内部 Observable this.todoService.getUserTodos(user.uid) 调用。

在组件销毁后,确保所有 Observables 都被取消订阅的正确方法是什么?

【问题讨论】:

  • 第 2 个:您只需要 takeUntil 运算符之一,删除哪一个都没关系。
  • 感谢您的回复。关于为什么#2是正确的任何解释或参考?
  • 无论您使用哪一个,都会看到流完成并且 observables 被取消订阅。如果没有其他人提供详细解释,我可能会在稍后添加答案。
  • 好的,没问题。欣赏!
  • 我回来回答这个问题,意识到我的 cmets 错了。您选择删除哪个很可能很重要,因为行为不同。

标签: angular rxjs observable angularfire2


【解决方案1】:

您不需要两个 takeUntil 运算符。您只需要一个,但行为会因您删除哪个而有所不同。

如果你只使用第一个takeUntil,像这样:

this.fireAuth.authState
  .takeUntil(this.ngUnsubscribe)
  .mergeMap((user) => this.todoService.getUserTodos(user.uid))
  .subscribe((todos) => this.userTodoArray = todos);

this.ngUnsubscribe 发出next 通知时,takeUntil 将取消订阅this.fireAuth.authState 源并完成。正如Observable Contract 中所述,当一个可观察对象完成时,其订阅者会收到complete 通知并自动取消订阅。

但是,如果从this.fireAuth.authState 发出了next 通知,并且getUserTodosmergeMap 中返回的可观察对象尚未完成,则mergeMap 实现不会取消订阅getUserTodos 可观察对象。如果getUserTodos observable 稍后发出next 通知,通知将流向subscribe

如果你只使用第二个takeUntil,像这样:

this.fireAuth.authState
  .mergeMap((user) => this.todoService.getUserTodos(user.uid))
  .takeUntil(this.ngUnsubscribe)
  .subscribe((todos) => this.userTodoArray = todos);

this.ngUnsubscribe 发出next 通知时,takeUntil 将取消订阅mergeMap,这将取消订阅this.fireAuth.authState 和任何返回的getUserTodos observable。

因此,在this.ngUnsubscribe 发出后,不会有任何通知流向subscribe。这很可能是您正在寻找的行为,因此您应该删除第一个 takeUntil 运算符。

【讨论】:

    猜你喜欢
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 2022-07-11
    • 1970-01-01
    • 2020-03-28
    • 2017-07-30
    • 1970-01-01
    相关资源
    最近更新 更多