根据数组中的每个项调用并等待一个observable并返回数组

时间:2017-09-13 11:42:37

标签: rxjs observable

我想在聊天中显示包含与每条消息相关的所有信息的消息列表(特别是每条消息的作者姓名)。 所以我有以下函数返回一个消息数组的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});
            })
}

邮件包含contentauthor_uid

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

所以最后我想返回一系列消息,每条消息都有contentauthor_info

我怎么能这样做?

2 个答案:

答案 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]) 
})
相关问题