【问题标题】:RxJS 1 array item into sequence of single items - operatorRxJS 1 数组项到单个项的序列中 - 运算符
【发布时间】:2017-04-07 16:44:48
【问题描述】:

鉴于这样的可观察性

Rx.Observable.of([1,2,3,4,5])

发出一个单个项目(即一个数组),什么是运算符,它将将此可观察对象转换为一个发出 5 个单个项目(或任何数组由)组成?

这个例子在.of,但是通过promise获取数组也是一样的,可能还有很多其他的例子。不建议将of替换为from

【问题讨论】:

    标签: javascript rxjs observable


    【解决方案1】:

    我想不出现有的运营商可以做到这一点,但你可以组成一个:

    arrayEmitting$.concatMap(arrayValues => Rx.Observable.merge(arrayValues.map(Rx.Observable.of)))
    

    或者更简单的

    arrayEmitting$.concatMap(Rx.Observable.of)
    

    或最短的

    arrayEmitting$.concatMap(x => x)
    

    这是未经测试的,所以让我知道这是否对您有用,并且使用 Rxjs v4 API(特别是最后一个)。这基本上是:

    • 将每个传入的值数组作为一个单元处理(这意味着下一个传入数组不会与前一个数组重叠 - 这就是我使用 concatMap 的原因)
    • 传入的数组被转换为一个可观察的数组,它们被合并:这确保了单独和按顺序发出值

    【讨论】:

    • 嗯,你写的很有意义:) 但奇怪的是没有运算符。如果您必须通过 AJAX/promise 获取数据并且数据恰好是一个项目数组——并且您想分别发出这些项目中的每一个——您会在上面做吗?
    • 你可以通过直接应用.of 来简化,但我以为你说你不想这样做,即arrayEmitting$.concatMap(Rx.Observable.of)
    • .concatMap(x => x) - 这就是答案!
    【解决方案2】:

    您也可以使用 flatMap 运算符 (https://stackoverflow.com/a/32241743/3338239):

    Observable.of([1, 2, 3, 4])
      .flatMap(x => x)
      .subscribe(x => console.log(x));
    // output:
    // 1
    // 2
    // 3
    // 4
    

    【讨论】:

      【解决方案3】:

      您现在可以使用from 将数组转换为序列。

      https://www.learnrxjs.io/operators/creation/from.html

      from([4,5,6])

      【讨论】:

        【解决方案4】:

        mergeAll:

        Observable.of([4, 5, 6])
          .mergeAll()
          .subscribe(console.log);
        // output:
        // 4
        // 5
        // 6
        

        【讨论】:

          【解决方案5】:

          不明白为什么concatMap(x => x)flatMap(x => x) 有效,它不会改变任何东西。 这应该可以工作(rxjs 6 或更高版本):

          of([4,5,6]).pipe(mergeMap(from))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-01-21
            • 1970-01-01
            • 2019-04-28
            • 2014-09-05
            • 1970-01-01
            • 2020-06-14
            • 1970-01-01
            • 2021-01-16
            相关资源
            最近更新 更多