【问题标题】:Wait for all observables in mergeMap to complete before emitting a custom value在发出自定义值之前等待 mergeMap 中的所有可观察对象完成
【发布时间】:2020-07-05 08:33:44
【问题描述】:

我想使用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
;

【问题讨论】:

    标签: rxjs reactivex mergemap


    【解决方案1】:

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

    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);
    

    现场演示:https://stackblitz.com/edit/rxjs-tx6bbe

    顺便说一句,有趣的事实:reduce() 使用相同的技巧inside Angular's Router package(只是没有种子值)。

    【讨论】:

    • 哈!很聪明,谢谢。但是,我不能说我喜欢这个解决方案的语义,乍一看很难理解发生了什么。我猜endWith(undefined) 更具可读性。
    • 是的,我也不会使用它,因为ignoreElements() + endWith() 更有意义,但您要求使用单个运算符:)。
    【解决方案2】:

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

    from([1, 2, 3, 4, 5])
      .mergeMap(number => multiply(number), 2)
      .ignoreElements()
      .endWith(undefined)
      .subscribe(console.log) // getting undefined here
    ;
    

    但是,如果有一个单独的运算符来做这件事,那就太好了。

    【讨论】:

      猜你喜欢
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      • 2021-12-22
      • 1970-01-01
      • 2019-03-25
      • 2021-11-10
      • 1970-01-01
      相关资源
      最近更新 更多