Angular RxJS - 取消订阅mergeMap?

时间:2018-02-21 02:53:50

标签: angular rxjs observable angularfire2

遵循此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. 只能从外部的Observable takeUntil()或内部的Observable authState()调用其中一个this.todoService.getUserTodos(user.uid)运算符。
  3. 哪个方法是正确的,以确保在组件被销毁后取消订阅所有Observable?

1 个答案:

答案 0 :(得分:8)

您不需要两个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将取消订阅complete来源并完成。正如Observable Contract中所述,当一个观察者完成时,其订阅者会收到next通知并自动取消订阅。

但是,如果从this.fireAuth.authState发出了getUserTodos通知,且mergeMapmergeMap返回的可观察性尚未完成,则getUserTodos实施不会取消订阅getUserTodos观察。如果next observable稍后发出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以及任何已退回的{{1}可观察的。

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