2017-07-29 27 views
3

試圖執行是應該下面的代碼:使用rxjs withLatestFrom功能

  • 檢索用戶
  • 的所有聊天記錄的列表獲取最後的消息對所有這些聊天
  • 檢索收件人對於所有這些聊天
  • 全部合併在一起作爲一個數組信息,其中每個項目是聊天的組合,最後的消息和接收者信息

    this.msgService.getUserChatList(this.uid).do((chats) => { 
        this.chats = []; 
        if (!(chats.length > 0)) 
         this.loading = false; 
        this.getLastMessages$ = this.getLastMessagesForChats(chats); 
        this.getRecipients$ = this.getRecipientsForChats(chats); 
    }).switchMap(chats => Observable.from(chats)).withLatestFrom(
        this.getLastMessages$, 
        this.getRecipients$, 
        (chat, lastMessages, recipients) => ({ 
        chat: chat, 
        last: lastMessages[chat['id']], 
        recipient: recipients[chat['id']] 
        }) 
    ).subscribe(chats => { 
        console.log('chats ', chats); 
        this.chats.push(chats); 
        this.loading = false; 
    }); 
    

附加功能

getLastMessagesForChats(chats: any): Observable<any[]> { 
    let lastMessages$ = []; 
    for (let chat of chats) { 
     let obs = this.msgService.getLastMessage(chat.id) 
     .map(last => ({chat: chat.id, last: last})); 
     lastMessages$[chat.id] = obs; 
    } 
    return Observable.from(lastMessages$).merge().toArray(); 
    } 

    getRecipientsForChats(chats: any): Observable<any[]> { 
    let recipients$ = []; 
    for (let chat of chats) { 
     let obs = this.userService.getUserPublicInfo(chat.recipient) 
     .map(recipient => ({chat: chat.id, recipient: recipient})); 
     recipients$[chat.id] = obs; 
    } 
    return Observable.from(recipients$).merge().toArray(); 
    } 

我收到以下錯誤

Uncaught (in promise): TypeError: Cannot read property 'subscribe' of undefined 
    TypeError: Cannot read property 'subscribe' of undefined 

我找不到什麼錯誤......我想在下面的JSBIN

重現

有什麼想法?

回答

1

鏈條自下而上構建。這意味着訂單是subscribe() - >withLatestFrom - >switchMap - >do

因此,在這裏withLatestFrom試圖訂閱getLastMessages$getRecipients$點他們是undefined,因爲他們的第一個值從源可觀察到其發生在do()傳播之後才分配。

編輯:

// Execution 
getLastMessages$ = Rx.Observable.of(1); 
getRecipients$ = Rx.Observable.of(2); 
chats = []; 

getUserChatList('uC') 
    .do((chats) => { 
    getLastMessages$ = getLastMessagesForChats(chats); 
    getRecipients$ = getRecipientsForChats(chats); 
    }) 
    .switchMap(chats => Rx.Observable.from(chats)) 
    .withLatestFrom(
    getLastMessages$, 
    getRecipients$, 
    (chat, lastMessages, recipients) => ({ 
     chat: chat, 
     last: lastMessages[chat['id']], 
     recipient: recipients[chat['id']] 
     })) 
    .subscribe(c => { 
    console.log('chats ', c); 
    chats.push(c); 
    }); 

http://jsbin.com/sulatar/3/edit?js,console

+0

我真的試圖初始化getLastMessages $和$ getRecipients用下面的代碼'this.getLastMessages $ =新的可觀察(); this.getRecipients $ = new Observable ();'但問題依然如此。任何想法如何我能設法使這項工作? –

+0

@ManuelRODRIGUEZ看到我的更新,這顯然不會產生你想要的結果,但你可以看到它的工作 – martin

+0

你沒有更多的錯誤,謝謝,但我不明白爲什麼'withLatestFrom'調用產生未定義。任何想法? –