如何在Observable中展平Observable数组

时间:2017-04-27 08:46:58

标签: angular 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);
  });

我想在我的数组中获取Observables的实际数据。 在过去的两天里,我尝试了很多不同的东西,但最后,我收到了任何东西,或者仍然收到带有Observables的数组。上面的代码没有返回任何内容。

2 个答案:

答案 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

一个更好的演示,演示了一个类似的(从阵列)解决方案:

http://jsbin.com/punoxitino/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 => { ... });