我有一个自动完成 HTTP 调用和一个执行搜索 HTTP 调用...我需要自动完成调用在触发执行操作时中止。我现在正在做的是使用这样的主题:
private onExecute$ = new Subject();
Run Code Online (Sandbox Code Playgroud)
在我的自动完成方法中:
executeAutoComplete(e) {
this.myService.searchAutoComplete(e.criteria)
.pipe(
takeUntil(this.onDestroy$),
takeUntil(this.onExecute$),
map(
// continue with more code
Run Code Online (Sandbox Code Playgroud)
然后在我的执行方法中我发出信号:
executeSearch(e) {
console.log('triggering onExecute signal');
this.onExecute$.next();
// other code
}
Run Code Online (Sandbox Code Playgroud)
所以在我的控制台中,我看到“触发 onExecute 信号”,但自动完成结果在完整搜索开始执行后返回,我认为一旦我发出信号,takeUntil 就会中止链?这是行不通的。
因此,本质上我试图阻止的行为是,当用户触发搜索时,自动完成结果不应返回并打开下拉列表,因为它不再相关。
我在这里缺少什么?
编辑 -
订单实际上是问题所在,因为总是在自动完成之前调用执行的去抖时间,订单无论如何都可能是不可预测的。没有意识到如果 Observable 链尚未激活, onExecute.next() 将会丢失。
我确实也设置了一个 searchLoading 变量,我该如何使用它?
我试过:
takeUntil(Observable.of(this.searchLoading))
Run Code Online (Sandbox Code Playgroud)
这是行不通的,因为它总是正确的!如何将 takeUntil 与动态评估的布尔值一起使用?
编辑2-
使用 takeWhile 来代替:
takeWhile(() => !this.searchLoading))
Run Code Online (Sandbox Code Playgroud)
难道是executeSearch之前叫的executeAutoComplete?如果onExecute$在构建可观察链之前已经发出了一个值,则不会停止搜索的执行。
顺便说一句:在我看来,unsubscribe当您运行搜索时调用订阅会更简单。
| 归档时间: |
|
| 查看次数: |
8406 次 |
| 最近记录: |