繁体   English   中英

RxJS (Interval) Observable 等待最后一个 observable 完成

[英]RxJS (Interval) Observable wait for last observable to complete

我想要一个可观察的间隔,它等待最后一次执行。 这是我的尝试。

简单的事情,不等待。

interval(1000)
  .subscribe(async x => {
    await new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * 10000) + 1000));
    console.log('Got counter', x);
  });

结果:4, 1, 2, 6, 9, 7, 6, 3, ...

下一次尝试,但有点糟糕。

let alreadyRunning = false;
interval(1000)
  .pipe(skipWhile(() => alreadyRunning))
  .subscribe(async x => {
    alreadyRunning = true;
    await new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * 10000) + 1000));
    console.log('Got counter', x, alreadyRunning);
    alreadyRunning = false;
  });

skipWhile 仅第一件事为真之前等待。

现在我尝试了 switchMap 也不起作用。

interval(1000)
  .pipe(switchMap(() => from(new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * 10000) + 1000)))))
  .subscribe(async x => {
    console.log('Got counter', x);
  });

也不工作:

interval(1000)
  .pipe(switchMap(x => from(async () => {
    await new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * 10000) + 1000));
    console.log('Got counter', x);
    return x;
  })))
  .subscribe(async x => {
    console.log('X', x);
  });

有没有解决方案来实现这一点? 等待最后一个 observable 完成? 订阅后没有机会这样做。 那么我以前怎么能做到这一点。

//编辑1:我想要什么?

我有一个执行 HTTP 请求的间隔。 因此,当 HTTP 请求等待几秒钟时,将执行下一个间隔,以便多次执行请求。

我想避免的。

MergeMap 也不起作用。

interval(1000)
  .pipe(mergeMap(x => from(new Promise(resolve => setTimeout(() => resolve(x), Math.floor(Math.random() * 10000) + 1000)))))
  .subscribe(async x => {
    console.log('Got counter', x);
  });

我不确定你在问什么,但如果用户 AJT82 是正确的(即,你想在上一个请求尚未完成时从间隔中删除任何排放)

以下是我将如何实现它:

interval(1000).pipe(
  tap(_ => console.log('interval hits every second!')),
  exhaustMap(_ => {
    console.log("request has started!")
    return timer(3000).pipe( // simulation that takes 3 seconds to complete
      tap(_ => console.log("request has finished!"))
    )
  })
).subscribe({
  next: v => console.log("Value emitted: ", v),
  error: e => console.log("Error emitted: ", e),
  complete: () => console.log("Complete emitted")
});

关于 async/await 的旁白

Observables 是 Promise 的严格超集。 这意味着如果你可以用 promise 做某事,你也可以用 observable 做这件事。

不过,与 Promises 不同的是,Observables 没有像 async/await 这样的特殊语法糖。

Observables 与 Promises 的互操作性相当好。 大多数操作员通过在后台为您转换 Promise 来处理 Promise 和 observables。

如果您的项目正在使用一个并且您想包含一个使用另一个的库,这将很有帮助。

另一方面,如果你的代码已经在使用 observables 机制,那么就永远没有理由使用 Promise。 除非您真的有很好的理由,否则应该避免这种代码气味。

暂无
暂无

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

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