2016-03-15 104 views
4

我想借此可观察到的< T [] >并将其转换为可观察到的<Ť>,使得来自每个阵列的可观测< T [] >被分解和然后通过Observable <T>单独发射阵列的各个元素。RXJS如何可观察<T[]>转换为可观察<T>

有没有这样做的标准操作符?我搜查了四周,但还没有找到任何东西。谢谢。


被指向concatMap/flatMap的方向后,我想出了以下的一般解决方法:

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

否不存在您描述的隐式功能。你需要自己写。这应该相当容易 - 只需遍历数组。 –

+0

当!那么它不应该很难实现。谢谢。如果您提交的是回复而不是评论,我会将其标记为答案 – iam1me

+0

也许某人出现了更好的解决方案 - 可能最终会使用库中的某些内容。 –

回答

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 here,文档here

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

+0

这是一个有趣的方法,感谢jsfiddle上的例子。我会在TypeScript中使用它。我更喜欢一些更直接的东西,但我总是可以创建一个包装这个 – iam1me

+0

在玩它和flatMap多一点后,我发现这适用于我的情况 - 谢谢 – iam1me

0

我也一直在玩转换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在固定阵列的情况下工作,不知道连续生成的源会发生什么情况)

+0

这应该是一个评论@ user3743222的回答,不是一个新答案 – jediz