首页 文章

Angular RxJS - 取消订阅mergeMap?

提问于
浏览
1

遵循此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,我想我也应该

  • 取消订阅它们(如上所示)或

  • 只能从外部Observable authState() 或内部Observable this.todoService.getUserTodos(user.uid) 调用 takeUntil() 运算符之一 .

哪个方法是正确的,以确保在组件被销毁后取消订阅所有Observable?

1 回答

  • 6

    您不需要两个 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中所述,当一个observable完成时,其订阅者会收到 complete 通知并自动取消订阅 .

    但是,如果从 this.fireAuth.authState 发出 next 通知并且 mergeMapgetUserTodos 返回的observable尚未完成,则 mergeMap 实现将不会取消订阅 getUserTodos observable . 如果 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 运算符 .

相关问题