【问题标题】:RxJS return array of values from mergeMapRxJS 从 mergeMap 返回值数组
【发布时间】:2020-11-03 21:46:21
【问题描述】:

我有一个可观察的流。第一个操作符是一个返回可观察数组的 mergeMap。然后我必须有第二个 mergeMap 从第一个 mergeMap 的返回中获取最终值。我觉得第二个 mergeMap 应该是不必要的,但找不到解决方法。

例子:

source$.pipe(
  mergeMap(() => [of(1), of(2), of(3)]),
  mergeMap((val) => val)
)

这最终是我所拥有的。第二个 mergeMap 只存在订阅第一个的输出。没有它,我的输出是可观察的(即of(1),而不是实际值 1)。有没有办法解决第二个 mergeMap?

【问题讨论】:

    标签: rxjs rxjs6


    【解决方案1】:

    您可以在 mergeMap 运算符中使用 merge 函数将 Observable 数组中的所有可观察对象合并为一个可观察对象,该可观察对象将在任何底层可观察对象发出时发出。

    sn-p 是:

    source$.pipe(
      mergeMap(() => merge(...[of(1), of(2), of(3)])),
    )
    

    【讨论】:

      【解决方案2】:

      原因是第一个mergeMap 应用于数组,不管数组。

      换句话说

      source$.pipe(
        mergeMap(() => ['a', 'b', 'c']),
      )
      

      首先发出 a 然后 b 然后 c 然后完成。

      因此,在您的情况下,您需要第二个 mergeMap 来展平发出的 Observables。

      作为一种替代方法,如果它对您的情况有意义,您可以使用forkJoin 而不是mergeMap。像这样的

      source$.pipe(
        forkJoin([of(1), of(2), of(3)]),
      )
      .subscribe(console.log) // '1' '2' '3'
      

      【讨论】:

      • 感谢您的回复,但是在这种情况下,我希望同时发出值,我不想等待全部完成。查看 tomcek112 的回答
      猜你喜欢
      • 2018-03-09
      • 2018-07-31
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 2022-01-24
      • 2021-07-18
      相关资源
      最近更新 更多