Rxjs 在发出自定义值之前,等待mergeMap中的所有可见项完成
我想同时使用Rxjs 在发出自定义值之前,等待mergeMap中的所有可见项完成,rxjs,reactivex,mergemap,Rxjs,Reactivex,Mergemap,我想同时使用flatMap处理一个可观察对象列表,然后在处理所有内部可观察对象时发出一个空值。是否有一种优雅的方法来实现这一点,即使用单个操作符 下面是一个例子: const{of,from}=Rx.Observable; from([1,2,3,4,5,6,7,8,9,10]) .mergeMap(number=>multiply(number),2)//一次处理两个数字 .last()//等待所有内部可观察对象完成 .map(=>undefined)//将last()返回的值强制转换为空值
flatMap
处理一个可观察对象列表,然后在处理所有内部可观察对象时发出一个空值。是否有一种优雅的方法来实现这一点,即使用单个操作符
下面是一个例子:
const{of,from}=Rx.Observable;
from([1,2,3,4,5,6,7,8,9,10])
.mergeMap(number=>multiply(number),2)//一次处理两个数字
.last()//等待所有内部可观察对象完成
.map(=>undefined)//将last()返回的值强制转换为空值
.subscribe()
;
函数乘法(数字){
返回(数字*2)//乘以数字
.delay(200)//添加轻微延迟
;
}
我知道我可以使用toArray()
或last()
来等待所有内部观察完成,但随后我需要使用map()
操作符将其转换为空值(如上面的示例所示)
我想,我正在寻找一个具有以下语义的操作符:在源可观测完成时发出X,例如:
from([1,2,3,4,5,6,7,8,9,10])
.mergeMap(数字=>乘法(数字),2)
.emitOnComplete(未定义)
.subscribe(console.log)//这里应该没有定义
;
到目前为止,我找到的最方便的方法是将运算符与:
from([1,2,3,4,5])
.mergeMap(数字=>乘法(数字),2)
.ignoreElements()
.endWith(未定义)
.subscribe(console.log)//此处未定义
;
但是,如果有一个操作符来处理这个问题,那就太好了。实际上有一个使用reduce()
的狡猾的解决方案,当它的源可观测完成时,它只发出一次。您可以使用它忽略所有值,只返回种子值:
from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
.pipe(
mergeMap(number => multiply(number), 2),
reduce((acc, value) => acc, undefined),
)
.subscribe(console.log);
现场演示:
顺便说一句,有趣的事实是:使用了与reduce()
相同的技巧(只是没有种子值)。Hah!那很聪明,谢谢。然而,我不能说我喜欢这个解决方案的语义,很难从第一眼就理解发生了什么。我想endWith(undefined)
可读性更好。是的,我也不会使用它,因为ignoreElements()
+endWith()
更有意义,但您要求使用一个运算符:)。