/ /観測量の観測量配列を平坦化する方法 - 角度、rxjs

Observable内のObservablesの配列を平坦化する方法 - 角度、rxjs

ネストされたObservableをフラット化しようとしていますが、うまく機能しません。

 this.af.object("test/father")
.map(res => {
res.namedKeys = [];
for (let el in res.keys) {
res.namedKeys.push(this.af.object(`test/keys/${el}`))
}
return res
})
.flatMap(res => Observable.combineLatest(res))
.subscribe(res => {
console.log("The final response:", res);
});

観測量の実際のデータを取得したい私の配列で。 私は過去2日間でいろいろなことを試しましたが、結局何も受け取らないか、それでもObservablesが入ったArrayを受け取ることになります。

回答:

回答№1は2

構造情報を提供していないので、問題が何であるかを確認するのはかなり困難です。

思う もしかして :

 for (let el in Object.keys(res))

の代わりに

 for (let el in res.keys)

また、 combineLatest 観測量を期待しています。あなたは1つを供給しませんでした:

代わりにこれを使用することを検討してください。

.flatMap(res => Rx.Observable.combineLatest(Rx.Observable.of(res)))

デモ(flatMapの代わりにswitchmapを使うrxjs 5を使う)
http://jsbin.com/cuvisecipi/1/edit?html,js,console,output

(配列からの)同様の解決策を示すより良いデモ:

http://jsbin.com/punoxitino/1/edit?html,js,console,output


回答№2の場合は1

.combineLatest 演算子は動作しますが、オブザーバブルの配列が必要です。あなたはそれをオブジェクトに渡している res Observablesの配列を持つプロパティが含まれています。

言い換えると .combineLatest これが必要です。 Observable[]
しかし、あなたはそれを渡している: { namedKeys: Observable[] }

だからあなたの問題は単にオブザーバブルを平らにすることではありません 複数の観測可能配列を新しいオブジェクト配列に結合元のオブジェクトも渡す必要があるからです。私は使うことをお勧めします forkJoin それはそれらが完了するまでそれがすべてのソースObservablesからすべてのアイテムを集めるためです。

this.af.object("test/father")
.concatMap(res => {
// the original object is here as well at index 0
observables = [ Observable.of(res) ];
for (let el in res.keys) {
observables.push(this.af.object(`test/keys/${el}`))
}
return Observable.forkJoin(observables);
})
.map(([res, ...namedKeys]) => {
res.namedKeys = namedKeys;
return res;
})
.subscribe(res => { ... });