为什么主题有时有效?

Why Subject works some times?

我有以下代码:

public clearSearch$ = new Subject<boolean>();

this.clearSearch$.pipe(mergeMap(() => this.searchResults$)).subscribe((groups: SearchGroup[]) =>
    groups.forEach((group) => {
        this.searchService.deleteResultGroup(group);
    }),
);

我使用点击方法只调用了一次主题:

public clear() {
    this.clearSearch$.next();
}

问题是当新数据到达 this.searchResults$ 时,块 this.clearSearch$.pipe(mergeMap(() => this.searchResults$)).subscribe() 再次工作。如何避免,只能点击调用?

有两种方法(可能更多,毕竟是编码..)

像你说的那样使用take(1)。这不会取消订阅 clearSearch$ 仅来自内部可观察对象:

this.clearSearch$.pipe(
  switchMap(() => this.searchResults$.pipe(take(1))
).subscribe((groups: SearchGroup[]) =>
  groups.forEach((group) => {
    this.searchService.deleteResultGroup(group);
  }),
);

如果将 take(1) 放在外部可观察对象上,这将不起作用:

// this will only be triggered once. Don't use this
this.clearSearch$.pipe(
  switchMap(() => this.searchResults$),
  take(1)
).subscribe((groups: SearchGroup[]) =>
  groups.forEach((group) => {
    this.searchService.deleteResultGroup(group);
  }),
);

或者你也可以使用withLatestFrom:

this.clearSearch$.pipe(
  withLatestFrom(this.searchResults$)
).subscribe(([_, groups]) => {
  groups.forEach((group) => {
    this.searchService.deleteResultGroup(group);
  }),
});