【发布时间】:2021-11-08 17:14:07
【问题描述】:
我有异步函数handleParamsChanges,它可能需要几秒钟才能解决。我在 observable 发出值时调用它:
this._activatedRoute.params
.subscribe(params => {
this.handleParamsChanges(params).then(() => {
// new value can be processed now
});
});
如何修改我的代码,以便如果 observable 一个接一个地发出 2 个值,第一个值调用 handleParamsChanges,并且只有 在这个承诺解决之后,它被调用第二个值,等等。
编辑:
这是我想出的解决方案,但我猜有更好的方法来做到这一点:
const params$ = this._activatedRoute.params;
const canExecute$ = new BehaviorSubject(true);
combineLatest(params$, canExecute$)
.pipe(
filter(([_, canExecute]) => canExecute),
map(([params]) => params),
distinctUntilChanged()
)
.subscribe(async params => {
canExecute$.next(false);
try {
await this.handleParamsChanges(params);
} catch (e) {
console.log(e);
} finally {
canExecute$.next(true);
}
})
我正在使用canExecute$ 来延迟新值的处理。
我需要在这里使用distinctUntilChanged 以避免创建无限循环。
【问题讨论】:
-
为什么在处理下一个值之前需要等待
handleParamsChanges完成? -
我正在该函数中获取数据并更新我的视图。无需等待,如果一个接一个地发出两个值,则我为第二个值发出的 http 请求可能在第一个值之前完成,这样我就会显示错误的数据。
标签: javascript angular rxjs