我有一个函数,该函数应返回带有ObservableCollection
列表的observable。
为此,我必须从另一个表Conversations
中获取用户对话ID,并将这些ID逐一合并。
Participants
我应该使用哪个运算符来合并这些可观察值?
答案 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())));