Angular 用take取消可观察到的直到不工作

Angular 用take取消可观察到的直到不工作,angular,rxjs,Angular,Rxjs,我有一个自动完成HTTP调用和一个执行搜索HTTP调用。。。触发执行操作时,我需要自动完成调用中止。我现在正在做的是使用这样一个主题: private onExecute$ = new Subject(); 在我的自动完成方法中: executeAutoComplete(e) { this.myService.searchAutoComplete(e.criteria) .pipe( takeUntil(this.onDestroy$), takeUntil(this.on

我有一个自动完成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
}
因此,在我的控制台中,我看到“触发OneExecute信号”,但在完全搜索开始执行后,自动完成结果返回,我认为一旦我发出信号,takeUntil将中止链?它不起作用

因此,我试图阻止的基本行为是,当用户触发搜索时,自动完成结果不应返回并打开下拉列表,因为它不再相关

我错过了什么

编辑-

订单实际上是由于在自动完成之前总是调用execute的去盎司时间而导致的问题,订单可能是不可预测的。未意识到如果可观察链尚未激活,onExecute.next()将丢失

我有一个searchLoading变量也设置了,我如何使用它

我试过:

takeUntil(Observable.of(this.searchLoading))
这不起作用,因为它总是正确的!如何将TakeTill与动态计算的布尔值一起使用

编辑2-

取而代之的是使用takeWhile:

takeWhile(() => !this.searchLoading))

是否在
executeAutoComplete
之前调用了
executeSearch
?如果
onExecute$
在构建可观察链之前已经发出了一个值,该值不会阻止搜索的执行


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

坏消息是,它可以工作

我一直在尝试使用您的代码的近似值来查找缺陷,但不幸的是无法找到。
我把它贴在这里,以防对某人有用

console.clear()
const takeUntil=Rx.operators.takeUntil;
const ondestory$=新的Rx.Subject();
const onExecute$=new Rx.Subject();
const source$=Rx.可观测计时器(01000)
const executeAt$=Rx.Observable.timer(3000)
执行官$
.订阅(x=>{
log('execute');
onExecute$.next();
})
来源$
.烟斗(
takeUntil(onDestroy$),
takeUntil(onExecute$)
)
.subscribe(console.log)

它很旧,但我有同样的塞纳里奥

如果要使用takeUntil,正确的主题是ReplaySubject

  • 因为如果Subject在takeUntil调用之前发出任何消息,那么当takeUntil订阅Subject时,它将不会重新提交(与实现一样),takeUntil也不会取消订阅源
  • 另一方面,ReplaySubject会在订阅时重新提交,因此TakeTill将取消内部取消订阅调用

您可以使用变量(takeUntil(()=>this.alive)并在任何地方将变量this.alive切换为true。我不确定this.onDestroy$是否随时变为false将检查顺序…当用户输入文本时,更改事件由子组件发送给父组件,当用户点击Enter键或单击搜索图标时,执行事件即为更改事件(autocomplete)应该在enter键(execute)之前发出,因为这是用户操作的顺序,但它可能不一定是按该顺序发出的…更改上有400毫秒的去抖动,因此可能会导致问题!我在我的原始问题中添加了一条关于此的注释,谢谢!感谢代码片段,因为这个概念是可行的(就像我认为应该的那样)让我更仔细地看一下代码,也许我遗漏了什么。。。