调用并等待基于数组中每个项目的可观察值并返回数组
问题描述:
我想要显示包含在与每条消息(特别是每条消息的作者名称)相关的所有信息的聊天中的消息列表。 所以我有以下的函数,返回可观察到的消息数组的:调用并等待基于数组中每个项目的可观察值并返回数组
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
。
我该怎么做?
答
如果this.af.list
返回可观察到发射结果的数组,你可以写:
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
订阅了所有这些数据。然后每个Inner Observable将additionalInfo
映射到原始的m
。
答
你应该检查出forkJoin
它将并行运行多个观测值并发出每个观测值的最新结果。
Observable.forkJoin(
Observable.of("Hello"),
Observable.of("World")
).subscribe(res => {
console.log(res[0], res[1])
})