遵循此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,我想我应该
takeUntil()
或内部的Observable authState()
调用其中一个this.todoService.getUserTodos(user.uid)
运算符。哪个方法是正确的,以确保在组件被销毁后取消订阅所有Observable?
答案 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
通知,且mergeMap
中mergeMap
返回的可观察性尚未完成,则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
运算符。