合并固定数量的合并映射观察值-RxJS

合并固定数量的合并映射观察值-RxJS,rxjs,observable,rxjs5,rxjs6,Rxjs,Observable,Rxjs5,Rxjs6,我使用的是RXJSV6,但这个问题也适用于v5 当使用mergeMap时,我原来的数组消失了,虽然我可以并行执行许多操作,但当我发送到mergeMap中的所有观察对象都完成时,我不再有办法进行监视 实例 ([1,2,3,4])的 .烟斗( 合并映射(值=>值), ) .subscribe(console.log) // 1 // 2 // 3 // 4 我想看看: /[1,2,3,4] 到目前为止,我提出的唯一方法需要获得数组的长度,但我肯定我缺少了一些操作符: ([1,2,3,4])的 .

我使用的是RXJSV6,但这个问题也适用于v5

当使用
mergeMap
时,我原来的数组消失了,虽然我可以并行执行许多操作,但当我发送到
mergeMap
中的所有观察对象都完成时,我不再有办法进行监视

实例 ([1,2,3,4])的

.烟斗(
合并映射(值=>值),
)
.subscribe(console.log)
// 1
// 2
// 3
// 4
我想看看:

/[1,2,3,4]
到目前为止,我提出的唯一方法需要获得数组的长度,但我肯定我缺少了一些操作符:

([1,2,3,4])的

.烟斗(
开关映射(值=>(
价值观
.烟斗(
合并映射(值=>value),
bufferCount(值.长度),
)
))
)
.subscribe(console.log)
使用mergeMap时,我的原始数组将消失

原因是
mergeMap
接受
observeibleInput
作为传入函数的参数。javascript
数组
是一个
可观察输入
,因此在
mergeMap
中工作,
mergeMap
完成它的工作,即展平
可观察输入
(考虑一下
mergeMap
以前被称为
flatMap

所以,正如@cartant所说,如果你想回到一个数组,你必须使用
toArray
操作符。 换句话说

of([1, 2, 3, 4])
.pipe(
    mergeMap(value => { // do stuff with a value of an array}),
    toArray()
)
.subscribe(console.log)
相当于

of([1, 2, 3, 4])
.pipe(
    map(values => values.map(value => { // do stuff with a value of an array})),
)
但是,如果您的数组包含可观察对象,并且您希望最终获得它们在所有这些对象发出时通知的值,那么您必须使用
forkJoin
。这是一个简单的例子

of([1, 2, 3, 4].map(n => of(n)))
.pipe(
    switchMap(observablesOfValues => forkJoin(observablesOfValues))
)
.subscribe(console.log)

听起来您正在寻找
toArray
操作符。或者,如果订单很重要,
forkJoin
工厂函数。
toArray
,我不知道RxJS v5+中存在此函数,它为我解决了这个问题!它允许我异步执行一组可观察对象,并可以选择等待它们全部完成以执行其他操作。