调用并等待基于数组中每个项目的可观察值并返回数组

问题描述:

我想要显示包含在与每条消息(特别是每条消息的作者名称)相关的所有信息的聊天中的消息列表。 所以我有以下的函数,返回可观察到的消息数组的:调用并等待基于数组中每个项目的可观察值并返回数组

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}); 
      }) 
} 

消息包含一个contentauthor_uid

在返回消息数组之前,对于每条消息,我希望首先检索作者信息(基于author_uid并通过I函数调用,例如getUserInfo(author_uid): Observable<any>)。

所以最后我想返回一组消息,并且每条消息都有一个contentauthor_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]) 
})