展平 Observable<Observable<Object[]>>

Flatten Observable<Observable<Object[]>>

我正在尝试在 Firebase 中创建连接。

因此,我从数据库中异步获取 ID 数组,然后为每个 ID 异步加载实际对象。该函数应该 return Observable

因此,对于第一个异步请求,我得到了 Observable(字符串是 ID)。 所以,无论我在这里尝试什么,我都会得到 Observable 或其他一些我不想得到的东西。

代码:

getUserFavourites(userId = ""):Observable<any[]> {
  return this.af.database.list('/ranks_by_user/likes/'+userId, {
    query: {
      orderByKey: true,
      limitToFirst: 50
    }
  }).flatMap( (likes:any[]) => {
    return like.map(like => {
      return this.af.database.object("/citations/" + like.$key)
    });
  });
}

错误是:

Type 'Observable<FirebaseObjectObservable<any>>' is not assignable to type 'Observable<any[]>'.

您可以使用 forkJoin 来获取引用数组。请注意,first 运算符用于从 object observables 获取当前值,因为 forkJoin 需要 observables 完成:

import { Observable } from "rxjs/Observable";
import "rxjs/add/observable/forkJoin";
import "rxjs/add/operator/first";
import "rxjs/add/operator/switchMap";

getUserFavourites(userId): Observable<any[]> {
  return this.af.database.list('/ranks_by_user/likes/' + userId, {
    query: {
      orderByKey: true,
      limitToFirst: 50
    }
  })
  .switchMap((likes: any[]) => Observable.forkJoin(
    likes.map(like => this.af.database.object("/citations/" + like.$key).first())
  ));
}

forkJoin 接受一个可观察对象数组,return 一个可观察对象发出一个可观察对象的最终值数组。

如果您要 return Citation 个实例,则需要创建它们(大概使用数据库中的值)。您可以使用 map 运算符来做到这一点:

import "rxjs/add/operator/map";
...
likes.map(like => this.af.database.object("/citations/" + like.$key).first().map(value => new Citation(value)))
...