状态改变时订阅陷入无限循环

Subscribe stuck in endless loop when state changed

有人知道如何解决向商店订阅内的商店发送操作时的无限循环吗?为了避免循环,我不得不在商店内添加一个条件,但我想知道是否有更优雅的方式让它工作。

无限循环代码:

ngOnInit(): void {
    this.store.select('admin').subscribe(
      (adminState: AdminState) => {
          const relations = 'dockSubscriptions,dockSubscription.dock,dock.tiles';
          const uri = `users/${adminState.currentUserId}?relations=${relations}`;
          this.apiService.get(uri).subscribe(
            (user: User) => {
              this.store.dispatch(new AppActions.SetCurrentUser(user));
              this.router.navigate(['/']);
              this.currentUserId = adminState.currentUserId;
            },
            (error) => {
              this.auth.logout();
            }
          );
        }
    );
  }

没有循环的代码:

ngOnInit(): void {
    this.store.select('admin').subscribe(
      (adminState: AdminState) => {
        if (adminState.currentUserId && adminState.currentUserId !== this.currentUserId) {
          const relations = 'dockSubscriptions,dockSubscription.dock,dock.tiles';
          const uri = `users/${adminState.currentUserId}?relations=${relations}`;
          this.apiService.get(uri).subscribe(
            (user: User) => {
              this.store.dispatch(new AppActions.SetCurrentUser(user));
              this.router.navigate(['/']);
              this.currentUserId = adminState.currentUserId;
            },
            (error) => {
              this.auth.logout();
            }
          );
        }
      }
    );
  }

有更好的解决方案吗?

使用 rxjs 中的 filter 运算符。

this.store.select('admin').pipe(filter(state => { return state.currentUserId && state.currentUserId !== this.currentUserId })).subscribe(...)

或者,您似乎并不真正需要对用户状态的公开订阅,因此您可以直接通过管道传输 take(1)