将RxJS v4代码转换为v5,使用" pull"处理队列

时间:2016-08-02 12:33:29

标签: javascript rxjs observable rxjs5 backpressure

---abcde-----f-------gh-----i---->  //Events

我有一个"工作队列"我想观察/订阅。这是要处理的命令对象数组。新的工作项目通常以突发形式到达,并且需要连续处理(按接收顺序,一次一个,直到完全处理)。

我正在使用RxJS 5.0.0-beta.6。 (其他图书馆强加的版本)

这是一个工作示例,说明了我想要的行为,但使用的是RxJS v4。

有问题的主要代码是......

var events$ = Rx.Observable.fromEvent(produceEvent, 'click')
  .timestamp()
  .tap(({timestamp}) => updatePanelAppend(pending, timestamp));

var inProgress$ = events$;

var done$ = inProgress$
  .flatMapWithMaxConcurrent(1, ({timestamp}) => 
                            Rx.Observable.fromPromise(() => {
                              updatePanelAppend(inProgress, timestamp);
                              removeFromPanel(pending, timestamp);
                              return expensiveComputation(getRandomInt(1, 5) * 1000, timestamp)
                           }));

done$.subscribeOnNext((timestamp) => {
  updatePanelAppend(done, timestamp);
  removeFromPanel(inProgress, timestamp);
});

http://jsbin.com/meyife/edit?js,output

考虑到API的当前beta状态和不完整/更改的文档,我无法弄清楚如何在RxJS 5中执行此操作。

更新:此migration guide用于从v4移至v5,显示已移除的许多功能,但未指示如何以新方式执行操作。已删除操作的示例:.tap,.controlled,.flatMapWithMaxConcurrent(已重命名)。

1 个答案:

答案 0 :(得分:2)

  • flatMap/mergeMap - 现在采用并发参数

  • tap - > do

  • subscribeOnNext已不复存在,因此只需将subscribe与一个参数一起使用。

  • RxJS 5上不存在
  • fromPromise重载,因此请改用defer

请参阅更新的jsbin here