我试图压扁一个嵌套的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);
});
我想在我的数组中获取Observables的实际数据。 在过去的两天里,我尝试了很多不同的东西,但最后,我收到了任何东西,或者仍然收到带有Observables的数组。上面的代码没有返回任何内容。
答案 0 :(得分:2)
很难看出问题是什么,因为你没有提供任何结构信息。
我想你的意思是:
for (let el in Object.keys(res))
而不是
for (let el in res.keys)
此外 - combineLatest
期望一个可观察的。你没有提供一个:
请考虑改用:
.flatMap(res => Rx.Observable.combineLatest(Rx.Observable.of(res)))
演示(使用rxjs 5,它使用switchmap而不是flatMap)
http://jsbin.com/cuvisecipi/1/edit?html,js,console,output
一个更好的演示,演示了一个类似的(从阵列)解决方案:
答案 1 :(得分:2)
.combineLatest
运算符可以工作,但它需要一组Observable。您正在向它传递一个对象res
,该对象包含一个带有Observable数组的属性。
换句话说,.combineLatest
需要这样:Observable[]
但是你传递了它:{ namedKeys: Observable[] }
所以你的问题不仅仅是扁平化Observables(例如。Combine multiple observable arrays into new object array),因为你也需要传递原始对象。我建议使用forkJoin
,因为它会收集所有源Observable中的所有项目,直到完成为止。
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 => { ... });