繁体   English   中英

RxJS:如何延迟下一个发出的值?

[英]RxJS: How to delay next emitted value?

我有异步函数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以避免创建无限循环。

您正在寻找的是concatMap 在再次订阅之前,它会等待之前的“内部 observable”完成。 你也可以大大简化你的管道:

params$.pipe(
  concatMap(params => this.handleParamsChanges(params)),
).subscribe()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM