RX:同步承诺

时间:2018-01-15 09:57:20

标签: rxjs reactive-programming

假设我有一个相当典型的rx使用,每当有一些更改事件发生时就会发出请求(我用.NET风格写这个,但我真的在想Javascript):

myChanges
    .Throttle(200)
    .Select(async data => {
        await someLongRunningWriteRequest(data);
    })

如果请求的时间超过200毫秒,则有可能在旧请求完成之前开始新请求 - 甚至可能是新请求首先完成

如何同步?

请注意,这与多线程无关,这是我唯一可以找到关于何时使用Google搜索“rx同步”或类似内容的信息。

1 个答案:

答案 0 :(得分:1)

您可以使用concatMap operator,只有在上一个项目完成后才开始处理下一个项目。

以下示例显示events$的间隔为200毫秒,然后以不同的持续时间连续处理:



const { Observable } = Rx;

const fakeWriteRequest = data => {
  console.log('started working on: ', data);
  return Observable.of(data).delay(Math.random() * 2000);
}

const events$ = Observable.interval(200);

events$.take(10)
  .concatMap(i => fakeWriteRequest(i))
  .subscribe(e => console.log(e));

<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
&#13;
&#13;
&#13;