2017-07-29 29 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'调用产生未定义。任何想法? –