【发布时间】:2020-06-24 05:23:32
【问题描述】:
我有一种方法可以根据搜索词搜索员工。
this._sub.pipe(
debounceTime(500),
filter(x => !!x),
distinctUntilChanged(),
switchMap(this.getResults.bind(this))
).subscribe((d: IDisplayEmp[]) => {
console.log('RES', d)
this.displayResults = d;
});
this._sub.next('mySearchTerm');
这很好用,如果发出新的 API 调用,则会取消以前的 API 调用。然而问题来了。
只有在 debounce 发出后才会取消活动的 API 调用。如果在 debounce 等待期间有一个活动的 API 调用返回,它仍然会触发我的订阅。
我理解这是因为取消只发生在 switchmap 的范围内。
是否有可能对此进行重构,以便在去抖动等待输入停止时取消任何待处理的 API 调用?
可能是一种幼稚的方法,但我尝试了类似下面的方法,它会发出值,但现在没有反跳效果。
this._sub.pipe(
filter(x => !!x),
distinctUntilChanged(),
switchMap((x) => {
return of(x)
.pipe(
debounceTime(500),
this.getResults.bind(this)
);
})
).subscribe((d: IDisplayEmp[]) => {
console.log('RES', d)
this.displayResults = d;
});
感谢您的帮助。
【问题讨论】:
-
我很不清楚你想要实现什么。也许
throttleTime做你想做的事? -
@martin 我正在尝试去抖动输入然后进行 API 调用。如果有新输入进入去抖,将等待输入停止,然后再发出结果值。我希望在 debounce 等待时取消活动的 API 调用(如果有的话),而不是在它发出当前行为之后。感谢您对
throttleTime的信息 -
那么你应该
concat你的api调用。 learnrxjs.io/operators/combination/concat.html -
@ritaj 抱歉,我正在努力了解如何应用它,我只在 debounce 发出值时触发单个 API 调用?
-
我会发布答案。
标签: angular typescript rxjs observable