【发布时间】:2018-05-11 09:48:46
【问题描述】:
我有一个自动完成 HTTP 调用和一个执行搜索 HTTP 调用...我需要在触发执行操作时中止自动完成调用。我现在正在做的是使用这样的主题:
private onExecute$ = new Subject();
在我的自动完成方法中:
executeAutoComplete(e) {
this.myService.searchAutoComplete(e.criteria)
.pipe(
takeUntil(this.onDestroy$),
takeUntil(this.onExecute$),
map(
// continue with more code
然后在我的执行方法中发出信号:
executeSearch(e) {
console.log('triggering onExecute signal');
this.onExecute$.next();
// other code
}
所以在我的控制台中,我看到“触发 onExecute 信号”,但自动完成结果在完整搜索开始执行后返回,我认为一旦我发出信号,takeUntil 将中止链?它不起作用。
所以基本上我试图阻止的行为是,当用户触发搜索时,自动完成结果不应该返回并打开下拉列表,因为它不再相关。
我在这里错过了什么?
编辑 -
由于总是在自动完成之前调用执行的去抖动时间,顺序实际上是问题,顺序可能是不可预测的。没有意识到如果 Observable 链尚未激活,onExecute.next() 将丢失。
我确实也设置了一个 searchLoading 变量,我该如何使用它?
我试过了:
takeUntil(Observable.of(this.searchLoading))
这是行不通的,因为它总是正确的!如何将 takeUntil 与动态评估的布尔值一起使用?
编辑 2 -
使用 takeWhile 得到它:
takeWhile(() => !this.searchLoading))
【问题讨论】: