遵循此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()
或内部Observablethis.todoService.getUserTodos(user.uid)
调用takeUntil()
运算符之一 .
哪个方法是正确的,以确保在组件被销毁后取消订阅所有Observable?
1 回答
您不需要两个
takeUntil
运算符 . 您只需要一个,但行为将根据您删除的行为而有所不同 .如果你只使用第一个
takeUntil
,就像这样:当
this.ngUnsubscribe
发出next
通知时,takeUntil
将取消订阅this.fireAuth.authState
来源并完成 . 如Observable Contract中所述,当一个observable完成时,其订阅者会收到complete
通知并自动取消订阅 .但是,如果从
this.fireAuth.authState
发出next
通知并且mergeMap
中getUserTodos
返回的observable尚未完成,则mergeMap
实现将不会取消订阅getUserTodos
observable . 如果getUserTodos
observable稍后发出next
通知,则通知将流向subscribe
.如果你只使用第二个
takeUntil
,就像这样:当
this.ngUnsubscribe
发出next
通知时,takeUntil
将取消订阅mergeMap
,这将取消订阅this.fireAuth.authState
和任何返回的getUserTodos
observable .因此,在
this.ngUnsubscribe
发出后,没有通知将流向subscribe
. 这可能是您正在寻找的行为,因此您应该删除第一个takeUntil
运算符 .