合并多个可观察对象并返回一个

时间:2018-07-23 22:39:51

标签: angular firebase rxjs observable angularfire2

我有一个函数,该函数应返回带有ObservableCollection列表的observable。 为此,我必须从另一个表Conversations中获取用户对话ID,并将这些ID逐一合并。

Participants

我应该使用哪个运算符来合并这些可观察值?

1 个答案:

答案 0 :(得分:1)

merge()不适用于firebase,因为Observable .valueChanges()永远不会完成,并且merge()要求它合并的所有Observable都必须完成才能发射结果值。来自docs

  

merge订阅每个给定的输入Observable(作为参数),并简单地将所有值从所有输入Observable转发(不进行任何转换)到输出Observable。仅当所有输入Observable完成后,输出Observable才完成。输入Observable传递的任何错误将立即在输出Observable上发出。

您将需要使用Observable.combineLatest()。另外,您可以使用Javascript的本机map()消除代码中的forloop

return this.firebase.collection<Participant>(this.PARTICIPANTS_COLLECTION, ref => ref.where('user_id', '==', user_id)).valueChanges()
    .map((participants: Participant[]) => participants.map(p => p.conversation_id))
    .mergeMap((ids: string[]) => Observable.combineLatest(ids.map(id => this.firebase.collection<Conversation>(this.CONVERSATIONS_COLLECTION, ref => ref.where('id', '==', id)).valueChanges())));