5

我想采用 Observable<T[]> 并将其转换为 Observable<T> 以便 Observable<T[]> 中的每个数组都被分解,然后数组的各个元素分别通过可观察的<T>。

是否有这样做的标准操作员?我四处寻找,但没有找到任何东西。谢谢。


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

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

2 回答 2

6

你可以这样使用concatMap

function identity (x) {return x}

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

这是因为concatMap它还接受数组(以及 observables 和 Promise)作为您作为参数传递的函数选择器的返回值。这里是Jsbin ,这里是文档

因此作为参数传递的数组成为选择器函数的返回值,然后concatMap在尊重数组顺序的同时被运算符展平。

于 2016-03-15T18:35:49.907 回答
0

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

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

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

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

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

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

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

于 2017-02-28T22:48:42.263 回答