angular - 用 takeUntil 取消 observable 不起作用

标签 angular rxjs

我有一个自动完成 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))

最佳答案

难道是executeSearchexecuteAutoComplete 之前调用?如果 onExecute$在构造可观察链之前已经发出了一个不会停止执行搜索的值。

顺便说一句:在我看来,调用 unsubscribe 会更简单。在您运行搜索时订阅。

关于angular - 用 takeUntil 取消 observable 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47523082/

相关文章:

angular - 从 id 与 rxjs Angular Firestore 合并可观察值

angular - 使用 'finalize, catcherror' 运算符时出错

angular - 有没有办法在延迟运算符之后将流 "Cancel"

javascript - AngularFire 不会触发更改检测

angular - 在Angular2中从父模块继承导入到子模块

angular - 如何正确地 forkJoin 可观察对象列表或其订阅?

html - Angular 2条件类在第二个条件下处于事件状态不起作用

node.js - 为什么 Stripe 付款不完整?

angular - 在 Angular 7 中动态添加行以形成

typescript - Angular2 Typescript 将 Firebase JSON 转换为对象