typescript 订阅未在构造函数中销毁[已关闭]

r7s23pms  于 2023-03-04  发布在  TypeScript
关注(0)|答案(1)|浏览(94)

这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
6小时前关门了。
截至5小时前,社区正在审查是否重新讨论此问题。
Improve this question
我有一个在父模板中由ngIf切换的组件。在组件构造函数中,我订阅了一个zip,当2个可观察对象发出数据时,它将触发。
该组件中还有一个函数,用于创建usersession,这两个函数都更新user$session$可观察值:

export class CreateSessionComponent implements OnDestroy {
  private x: Subscription;

  constructor(
    private sessionService: SessionService,
    private userService: UserService
  ) {
    this.x = zip(this.userService.user$, this.sessionService.session$)
      .pipe(filter((data) => !!data[0]))
      .subscribe({
        next: (data) => console.log(data),
      });
  }

  public createUserAndSession(): void {
    this.sessionService.createSession();
    this.userService.createUser();
  }

  ngOnDestroy(): void {
    this.x.unsubscribe;
    console.log('destroy');
  }
}

当我第一次添加会话时,一切都按预期工作,但是当我第二次打开create-session组件时,我首先从zip中获得订阅中的前一个结果,当我添加另一个会话时,订阅被触发两次。
https://stackblitz.com/edit/angular7-rxjs-5pd12h

vltsax25

vltsax251#

我最终使用take(1)取消订阅可观察对象,并通过将user$session$设置为null修复了“组件加载时zip触发”,这样zip就过滤掉了结果,什么也不会发生:

constructor(
  private userService: UserService,
  private sessionService: SessionService,
) {
  this.sessionService.setSession(null)
  this.userService.setUser(null)

  zip(this.userService.user$, this.sessionService.session$).pipe(
    filter((data) => !!data[0] && !!data[1]),
    take(1),
  ).subscribe({
    next: (data) => this.sessionService.connectHostToSession(data[0]!, data[1]!),
    complete: () => console.log('complete')
  })
}

我想是因为我在session$user$上使用了behaviorSubject,所以当create-session组件加载时,它们会发出它们的最后一个值。通过将它们设置为null,它们仍然会发出,但会发出一个空值。

相关问题