合并固定数量的合并映射观察值-RxJS
我使用的是RXJSV6,但这个问题也适用于v5 当使用合并固定数量的合并映射观察值-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])的 .
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+中存在此函数,它为我解决了这个问题!它允许我异步执行一组可观察对象,并可以选择等待它们全部完成以执行其他操作。