代码之家  ›  专栏  ›  技术社区  ›  Stan

Angular RxJS-取消订阅mergeMap?

  •  3
  • Stan  · 技术社区  · 6 年前

    遵循此堆栈溢出帖子中描述的最佳实践: Angular RxJS When Should I Unsubscribe From Subscription ,请考虑此角度组件生命周期挂钩:

    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() 两个都返回可见光,我想我应该

    1. 取消两人的订阅(如上所示)或
    2. 只调用 takeUntil() 运算符,无论是从外部可见 authState() 或内部可观察 this.todoService.getUserTodos(user.uid) .

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

    1 回复  |  直到 6 年前
        1
  •  15
  •   cartant    6 年前

    您不需要同时使用 takeUntil 操作员。您只需要一个,但行为会因您移除的对象而异。

    如果只使用第一个 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 并将完成。如中所述 Observable Contract ,当observable完成时,其订阅者将收到 complete 通知和将自动取消订阅。

    但是,如果 下一个 通知是从发出的 这fireAuth。authState公司 以及 getUserTodos mergeMap 尚未完成 合并地图 实施不会从取消订阅 getUserTodos 可观察到。如果 getUserTodos observable later发出 下一个 通知,通知将传递到 subscribe .

    如果只使用第二个 takeUntil公司 ,如下所示:

    this.fireAuth.authState
      .mergeMap((user) => this.todoService.getUserTodos(user.uid))
      .takeUntil(this.ngUnsubscribe)
      .subscribe((todos) => this.userTodoArray = todos);
    

    什么时候 这ngUnsubscribe公司 发出 下一个 通知 takeUntil公司 将从取消订阅 合并地图 ,将从中取消订阅 这fireAuth。authState公司 从任何返回的 getUserTodos 可观察到。

    所以,之后 这ngUnsubscribe公司 发出时,不会有通知流到 订阅 . 这很可能是您正在寻找的行为,因此您应该删除第一个 takeUntil公司 操作人员