抽象的问题
有没有办法以外部可观察对象的原始顺序使用mergeMap
的结果,同时仍然允许内部可观察对象并行运行?
更详细的解释
让我们来看看两个合并映射操作符:
...which接受映射回调,以及可以同时运行多少个内部可观察对象:
of(1,2,3,4,5,6).pipe( mergeMap( => api.get(‘/=>’,{.pipe }),3) );
在:https://codepen.io/JosephSilber/pen/YzwVYNb?editors=1010的行动中查看它
这将分别为1
、2
和3
发出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
的好处,即给定数量的请求可以并行运行,同时仍然以原始顺序发出映射值?
我的具体问题
上面抽象地描述了这个问题。当你知道手头的实际问题时,有时更容易推断出问题,所以这里是这样的:
const orderNumbers = 1,2,3,4,5,6,7,8,9,10;const
shipOrder
方法,它实际发送订单。它返回一个Promise
:const api.shipOrder(orderNumber); = orderNumber => const
mergeMap
来处理:来自(OrderNumbers).pipe( mergeMap(orderNumber => shipOrder(orderNumber),5) );
printShippingLabel
函数,给定已发货订单的订单号,它将打印其发货标签。因此,我订阅了我们的observable,并在值传入时打印运输标签:从(OrderNumbers) .pipe(mergeMap(orderNumber => shipOrder(orderNumber),5)) .pipe(orderNumber => from
mergeMap
会根据shipOrder
完成其请求的时间发出值。我想要的是以与原始list.相同的顺序打印标签
这有可能吗?
可视化
有关问题的可视化信息,请参阅此处:https://codepen.io/JosephSilber/pen/YzwVYZb?editors=1010
您可以看到,早些时候的订单甚至在发货之前就已经打印出来了。
https://stackoverflow.com/questions/57045892
复制相似问题