RXJS 如何将 Observable<T[]> 转换为 Observable<T>

RXJS How to convert Observable<T[]> to Observable<T>

我想采用 Observable 并将其转换为 Observable,这样 Observable 中的每个数组都被分解,然后数组的各个元素被分解通过 Observable 单独发出。

是否有标准的运算符来执行此操作?我四处搜寻但没有找到任何东西。谢谢


在被指向concatMap/flatMap的方向后,想出以下通用解决方案:

var source: Observable<T[]>;
...
var splitSource = source.flatMap<T>((x:T[]) => { return Rx.Observable.fromArray(x); });

您可以这样使用 concatMap

function identity (x) {return x}

var obs_of_array$ = Rx.Observable.return(['1','2','you got it'])
    .concatMap(identity)

这是有效的,因为 concatMap 也接受数组(以及可观察对象和承诺)作为您作为参数传递的函数选择器的 return 值。杰斯宾 here, documentation here

因此作为参数传递的数组成为选择器函数的 return 值,然后在遵守数组顺序的情况下由 concatMap 运算符展平。

我也一直在尝试将 Observable<T[]> 转换为 Observable<T>

我发现 flatMap() 可以自己完成这项工作,我认为 11 个月前提出问题时情况并非如此。

为了说明,在@user3743222 的回答中的 jsfiddle 中,您可以进行此更改并获得相同的输出:

//.concatMap(identity)
.flatMap(theArray=>theArray)

我使用它和 toArray() 运算符在管道中执行集合操作,例如对可观察对象进行排序。

    let sorted$ = source$.toArray().flatMap(theList=> theList.sort(this.myComparer) )

输出为Observable<T>。 (N.B 在固定数组的上下文中工作,不确定连续生成的源会发生什么)