使用rxjs withLatestFrom功能
问题描述:
试图执行是应该下面的代码:使用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
重现有什么想法?
答
链条自下而上构建。这意味着订单是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);
});
我真的试图初始化getLastMessages $和$ getRecipients用下面的代码'this.getLastMessages $ =新的可观察(); this.getRecipients $ = new Observable ();'但问题依然如此。任何想法如何我能设法使这项工作? –
@ManuelRODRIGUEZ看到我的更新,这显然不会产生你想要的结果,但你可以看到它的工作 – martin
你没有更多的错误,谢谢,但我不明白为什么'withLatestFrom'调用产生未定义。任何想法? –