提问者:小点点

Angular RxJS-取消订阅合并映射?


遵循此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()都返回可观察对象,我想我应该要么

  1. 取消订阅它们(如上所示)或
  2. 只调用todoService. getUserTodos(user.uid)运算符中的一个,无论是从外部可观察autState()还是内部可观察this.todoService.getUserTodos(user.uid)

哪种方法可以确保在组件销毁后取消订阅所有可观察对象?


共1个答案

匿名用户

您不需要两个带直到运算符。您只需要一个,但行为会因您删除的哪一个而异。

如果您只使用第一个取值,如下所示:

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订阅发出后,不会有任何通知流向订阅。这很可能是您正在寻找的行为,因此您应该删除第一个取值到运算符。