等待mergeMap中的所有可观察对象在发出自定义值之前完成

问题描述 投票:1回答:2

我想使用flatMap同时处理可观察物列表,然后在处理所有内部可观察物时发出一个空值。是否有一种优雅的方法可以实现这一点,即使用单个运算符?

这里是示例:

const { of, from } = Rx.Observable;

from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
  .mergeMap(number => multiply(number), 2) // processing two numbers at a time
  .last() // waiting for all inner observables to complete
  .map(_ => undefined) // casting a value returned by last() to an empty value
  .subscribe()
;

function multiply(number) {
  return of(number * 2) // multiplying the number
    .delay(200) // adding a slight delay
  ;
}

我知道我可以使用toArray()last()等待所有内部可观对象完成,但是随后我将需要使用map()运算符将其强制转换为空值(如上述示例中所示。)>

我猜,我正在寻找具有以下语义的运算符:emit X when source observable completes,例如:

from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
  .mergeMap(number => multiply(number), 2)
  .emitOnComplete(undefined)
  .subscribe(console.log) // we should get undefined here
;

我想使用flatMap同时处理可观察对象列表,然后在处理所有内部可观察对象时发出一个空值。是否有一种优雅的方法来实现这一目标,即使用...

rxjs reactivex mergemap
2个回答
0
投票

到目前为止,我设法找到的最方便的方法是将ignoreElements运算符与endWith组合在一起:


0
投票

实际上有一个使用reduce()的偷偷摸摸的解决方案,当其源可观察到的源完成时,它仅发出一次。您可以使用它忽略所有值,而只返回种子值:

© www.soinside.com 2019 - 2024. All rights reserved.