首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有原始顺序的RxJS mergeMap()

具有原始顺序的RxJS mergeMap()
EN

Stack Overflow用户
提问于 2019-07-16 03:13:05
回答 4查看 2.2K关注 0票数 6

抽象的问题

有没有办法以外部可观察对象的原始顺序使用mergeMap的结果,同时仍然允许内部可观察对象并行运行?

更详细的解释

让我们来看看两个合并映射操作符:

...which接受映射回调,以及可以同时运行多少个内部可观察对象:

of(1,2,3,4,5,6).pipe( mergeMap( => api.get(‘/=>’,{.pipe }),3) );

https://codepen.io/JosephSilber/pen/YzwVYNb?editors=1010的行动中查看它

这将分别为123发出3个并行请求。一旦其中一个请求完成,它就会触发另一个对4的请求。依此类推,始终保持3个并发请求,直到处理完所有值。

但是,由于先前的请求可能在后续请求之前完成,因此生成的值可能顺序混乱。因此,不是:

2、4、6、8、10、12

...we实际上可能会得到:

4、2、8、10、6、12 //或任何其他排列

...enter concatMap.该运算符确保所有可观测对象都按原始顺序连接,因此:

of(1,2,3,4,5,6).pipe( concatMap( => api.get(‘/=>’,{.pipe} );

...will始终生成:

2、4、6、8、10、12

https://codepen.io/JosephSilber/pen/OJMmzpy?editors=1010的行动中查看它

这就是我们想要的,但现在请求将不会并行运行。正如the documentation所说:

concurrency参数设置为1.时,concatMap等效于mergeMap

所以回到问题:有没有可能获得mergeMap的好处,即给定数量的请求可以并行运行,同时仍然以原始顺序发出映射值?

我的具体问题

上面抽象地描述了这个问题。当你知道手头的实际问题时,有时更容易推断出问题,所以这里是这样的:

  1. I有一个必须发货的订单列表:

const orderNumbers = 1,2,3,4,5,6,7,8,9,10;const

  1. 我有一个shipOrder方法,它实际发送订单。它返回一个Promise

const api.shipOrder(orderNumber); = orderNumber => const

  1. 应用编程接口最多只能同时处理5个订单发货,所以我使用mergeMap来处理:

来自(OrderNumbers).pipe( mergeMap(orderNumber => shipOrder(orderNumber),5) );

  1. 订单发货后,我们需要打印其发货标签。我有一个printShippingLabel函数,给定已发货订单的订单号,它将打印其发货标签。因此,我订阅了我们的observable,并在值传入时打印运输标签:

从(OrderNumbers) .pipe(mergeMap(orderNumber => shipOrder(orderNumber),5)) .pipe(orderNumber => from

  1. 这是可行的,但现在运输标签是在 order之外打印的,因为mergeMap会根据shipOrder完成其请求的时间发出值。我想要的是以与原始list.

相同的顺序打印标签

这有可能吗?

可视化

有关问题的可视化信息,请参阅此处:https://codepen.io/JosephSilber/pen/YzwVYZb?editors=1010

您可以看到,早些时候的订单甚至在发货之前就已经打印出来了。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57045892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档