我想在聊天中显示包含与每条消息相关的所有信息的消息列表(特别是每条消息的作者姓名)。 所以我有以下函数返回一个消息数组的Observable:
getLastMessagesOfEvent(eventId: string, limitTo?: number): Observable<any> {
console.log('MessageService#getLastMessagesOfEvent - Event ID: eventId');
let chatIdPath = `/${this.authService.getCurrentUserCompany()}/events/${eventId}/chat`;
return this.af.object(chatIdPath)
.mergeMap(chat => {
let chatId = chat.$value
console.log('chatId ', chatId);
let chatPath = `/${this.authService.getCurrentUserCompany()}/eventChats/${chatId}/messages`;
let query: any = {};
query.orderByChild = 'timestamp';
if (limitTo) query.limitToLast = limitTo;
return this.af.list(chatPath, {query: query});
})
}
邮件包含content
和author_uid
。
在返回消息数组之前,我希望对于每条消息,首先检索作者信息(基于author_uid
并通过I函数调用实例getUserInfo(author_uid): Observable<any>
)。
所以最后我想返回一系列消息,每条消息都有content
和author_info
。
我怎么能这样做?
答案 0 :(得分:1)
如果this.af.list
返回发出结果数组的Observable,你可以写:
this.af.object(chatIdPath)
.mergeMap(chat => {...})
.mergeMap(messages => Observable.forkJoin(
messages.map(m => getUserInfo(m.author_uid)
.map(additionalInfo => {
m.additionalInfo = additionalInfo;
return m;
})
)
))
.subscribe(messages => console.log(messages))
由于显而易见的原因,我没有测试它,但你应该明白这一点。
messages.map()
表达式返回一个Observables数组,其中forkJoin
订阅了所有这些。然后每个内部Observable将additionalInfo
映射到原始m
。
答案 1 :(得分:0)
你应该检查forkJoin
,它将并行运行多个observable并从每个observable发出最新的结果。
Observable.forkJoin(
Observable.of("Hello"),
Observable.of("World")
).subscribe(res => {
console.log(res[0], res[1])
})