rxjs withLatestFrom函数的使用
正在尝试执行以下应执行的代码:rxjs withLatestFrom函数的使用,rxjs,observable,rxjs5,Rxjs,Observable,Rxjs5,正在尝试执行以下应执行的代码: 检索用户所有聊天记录的列表 检索所有这些聊天的最后一条消息 检索所有这些聊天的收件人信息 将所有内容合并为一个数组,其中每个项目都是聊天、最后一条消息和收件人信息的组合 this.msgService.getUserChatList(this.uid).do((chats) => { this.chats = []; if (!(chats.length > 0)) this.loading = false; t
- 检索用户所有聊天记录的列表
- 检索所有这些聊天的最后一条消息
- 检索所有这些聊天的收件人信息
- 将所有内容合并为一个数组,其中每个项目都是聊天、最后一条消息和收件人信息的组合
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();
}
我找不到哪里出了问题。。。我试着用下面的方法复制
有什么想法吗?链条是自下而上构建的。这意味着顺序是
subscribe()
->,最晚从->开关映射->do
因此,当withLatestFrom
尝试订阅getLastMessages$
和getRecipients$
时,它们是未定义的,因为它们只有在从源可观察对象传播第一个值之后才被分配,这发生在do()
中
编辑:
我实际上试图用下面的代码初始化getLastMessages$和getRecipients$。getLastMessages$=new Observable();this.getRecipients$=new Observable()代码>但问题依然存在。你知道我怎样才能做到这一点吗?@ManuelRODRIGUEZ看看我的更新,这显然不会产生你想要的结果,但你可以看到它工作了。你没有错,谢谢,但我不明白为什么withLatestFrom
调用会产生未定义的结果。有什么想法吗?@ManuelRODRIGUEZ它不会产生未定义的。当withLatestFrom
尝试订阅时,这两个源观测值是未定义的
。
Uncaught (in promise): TypeError: Cannot read property 'subscribe' of undefined
TypeError: Cannot read property 'subscribe' of undefined
// 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);
});