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()
更有意义,但您要求使用一个运算符:)。