将可观察的<t []>减少到T []

时间:2017-03-30 12:46:19

标签: javascript typescript rxjs angular2-observables

如果我正在使用Observable<number[]>,我想将所有排放量收集到一个number[]

我总是这样做:

const items$ = Rx.Observable.of([10, 20, 30], [20,30,40])
  .reduce((acc, curr) => acc.concat(curr));

let itemsArray = [];

items.subscribe(arr => itemsArray = arr);

console.log(itemsArray); // [10, 20, 30, 20, 30, 40]

我只是想知道是否有任何方法可以&#34; 收集&#34;来自Observable的项目 - 在RxJS中内联而不调用可观察的订阅。

这会建议采用同步方法,鉴于observable的异步特性,我不确定是否可行。

类似的东西:

const itemsArray = Rx.Observable.of([10, 20, 30], [20,30,40])
  .reduce((acc, curr) => acc.concat(curr))
  .collect( /* return a number[]  - not an Observable<number[]> */);


console.log(itemsArray); // [10, 20, 30, 20, 30, 40]

2 个答案:

答案 0 :(得分:1)

如果没有订阅,你就无法做到 这是一个流(冷),你需要订阅才能获得价值。

那就是说,我想你想要的是等到最后一个值发出,并随着时间的推移接收新的连接数组(这是完全可能的)。

要使用的运营商是: scan 实际上,你在减少方面并不远;)!!

const items$ = Rx
  .Observable
  .of([10, 20, 30], [20,30,40])
  .scan((acc, curr) => acc.concat(curr), []);


items$.subscribe(arr => console.log(arr));

https://plnkr.co/edit/2e8eR6RrHrrE1WOuRRdf?p=preview

答案 1 :(得分:0)

+1 Maxime的答案。

为了完整性,如果ObservableScalarObservable,您可以找到value属性。

但这不是文档化API的一部分,因此考虑到可维护性,这不是一件好事。