我有一个自动完成 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 与动态评估的 bool 值一起使用?
编辑 2 -
改用 takeWhile 得到它:
takeWhile(() => !this.searchLoading))
最佳答案
难道是executeSearch
在 executeAutoComplete
之前调用?如果 onExecute$
在构造可观察链之前已经发出了一个不会停止执行搜索的值。
顺便说一句:在我看来,调用 unsubscribe
会更简单。在您运行搜索时订阅。
关于angular - 用 takeUntil 取消 observable 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47523082/