遵循此Stack Overflow帖子中描述的最佳实践:Angular RxJS我什么时候应该取消订阅,考虑这个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();
}
由于autState()
和mergeMap()
都返回可观察对象,我想我应该要么
todoService. getUserTodos(user.uid)
运算符中的一个,无论是从外部可观察autState()
还是内部可观察this.todoService.getUserTodos(user.uid)
。哪种方法可以确保在组件销毁后取消订阅所有可观察对象?
您不需要两个带直到
运算符。您只需要一个,但行为会因您删除的哪一个而异。
如果您只使用第一个取值
,如下所示:
this.fireAuth.authState
.takeUntil(this.ngUnsubscribe)
.mergeMap((user) => this.todoService.getUserTodos(user.uid))
.subscribe((todos) => this.userTodoArray = todos);
当this. ngUn订阅
发出next
通知时,toto_t
将取消订阅this.fire Ar.autState
源并完成。如可观察合约中所述,当可观察对象完成时,其订阅者会收到完成
通知并自动取消订阅。
但是,如果从this. fire Ar.autState
发出了next
通知,并且mergeMap
中的getUserTodos
返回的可观察对象尚未完成,则mergeMap
实现不会取消订阅getUserTodos
可观察对象。如果getUserTodos
可观察对象稍后发出next
通知,则通知将流经订阅
。
如果您只使用第二个取值
,如下所示:
this.fireAuth.authState
.mergeMap((user) => this.todoService.getUserTodos(user.uid))
.takeUntil(this.ngUnsubscribe)
.subscribe((todos) => this.userTodoArray = todos);
当this. ngUn订阅
发出next
通知时,totodos
将取消订阅mergeMap
,它将取消订阅this.fire Ar.autState
和任何返回的getUserTodos
可观察的。
因此,在this. ngUn订阅
发出后,不会有任何通知流向订阅
。这很可能是您正在寻找的行为,因此您应该删除第一个取值到
运算符。