2017-09-13 18 views
1

各メッセージに関連するすべての情報(特に各メッセージの著者名)を含むチャットに含まれるメッセージのリストを表示したい。 だから私は、メッセージの配列の観測を返し、次の機能があります。配列の各項目に基づいて観測値を呼び出し、配列を返す

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に基づいて、そして関数getUserInfo(author_uid): Observable<any>という名前で)作成者情報を取得してください。

最後にメッセージの配列を返したいと思います。メッセージごとにcontentauthor_infoがあります。

どうすればいいですか?

答えて

1

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は、それらすべてにサブスクライブします。次に、Observableの各内側がadditionalInfoを元のmにマッピングします。

0

forkJoinをチェックして、複数の観測値を並列に実行し、それぞれから最新の結果を放出する必要があります。

Observable.forkJoin(
    Observable.of("Hello"), 
    Observable.of("World") 
).subscribe(res => { 
    console.log(res[0], res[1]) 
}) 
関連する問題