【问题标题】:Flatten Observable<Observable<Object[]>> [closed]展平 Observable<Observable<Object[]>> [关闭]
【发布时间】:2017-01-13 21:00:57
【问题描述】:

我正在尝试在 Firebase 中创建一个联接。

所以,我从数据库异步获取 id 数组,然后为每个 id 异步加载实际对象。并且该函数应该返回 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&lt;FirebaseObjectObservable&lt;any&gt;&gt;' is not assignable to type 'Observable&lt;any[]&gt;'.

【问题讨论】:

  • 您可以在问题中包含您的代码吗?
  • 已更新代码
  • 您需要包含Citation 的代码。是接口还是类?如果它是一个类,至少你需要指出构造函数需要哪些参数。
  • 这是一门课。但是这里没有任何特定于类的事情。它很容易成为“任何”类型。我只是按原样粘贴代码。已更新。

标签: asynchronous firebase rxjs angularfire2 angular2-observables


【解决方案1】:

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

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 接受一个 observable 数组并返回一个 observable,该 observable 发出一个 observable 最终值的数组。

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

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

【讨论】:

  • 完美!谢谢你。按预期工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 2018-10-24
相关资源
最近更新 更多