为什么主题有时有效?
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);
}),
});
我有以下代码:
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);
}),
});