【问题标题】:Converting RxJS v4 code to v5, processing a queue with a "pull"将 RxJS v4 代码转换为 v5,使用“拉”处理队列
【发布时间】:2023-03-27 22:12:01
【问题描述】:
---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(重命名)。

【问题讨论】:

标签: javascript rxjs observable rxjs5 backpressure


【解决方案1】:
  • flatMap/mergeMap - 现在采用并发参数

  • tap -> do

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

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

查看更新的jsbinhere

【讨论】:

  • 太棒了!非常有帮助!注意:将 RxJS 版本更改为 5.0.0-beta.6 后,需要进行一些更改。就像那个版本中不存在 .timestamp() 运算符一样。所以我只是从鼠标点击事件中提取了时间戳,因为这不是代码的核心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
相关资源
最近更新 更多