Angular 用take取消可观察到的直到不工作
我有一个自动完成HTTP调用和一个执行搜索HTTP调用。。。触发执行操作时,我需要自动完成调用中止。我现在正在做的是使用这样一个主题: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
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将取消内部取消订阅调用