请考虑以下代码:
this.msgService.getUserChatList()
.do( (list) => {
this.unread = false;
console.log(list);
} )
.mergeMap( chats => Observable.from(chats) )
.mergeMap( chat => this.msgService.getLastMessage(chat['id']).map( lastMessage => this.containsUnreadMessages(lastMessage, chat['lastPresence']) ) )
.filter( state => state === true )
.subscribe( (unread) => {
this.unread = true;
console.log('result ', res);
} );
getUserChatList(): - 每次聊天更改时发出一个元素 - 元素是包含所有聊天元数据的原始数组 - 永远不会完成
getLastMessage(): - 是一个永不完成的Observable
在第二个mergeMap中,我调用函数getLastMessage()。 我需要观察这个可观察的,直到 getUserChatList()发出一个新项目,否则我会对同一个聊天的最后一条消息进行多次观察。
插图:
getUserChatList
发出:[chatMetaA:{},chatMetaB:{}] getLastMessage
并开始观察chatA和chatB的lastMessage getUserChatList
发出了一个新项目,其中包含聊天元数据的新版本:[chatMetaA:{},chatMetaB:{}] getLastMessage
并开始观察chatA和chatB的lastMessage。所以我们现在观察chatA和chatB的最后一条消息它会继续......
我的问题是,一旦getUserChatList()发出新项目,我怎么能取消对getLastMessage()的观察?我尝试使用switch但无法使其正常工作
答案 0 :(得分:1)
解决方案确实是使用switchMap:
this.msgService.getUserChatList()
.do( () => { this.unread = false } )
.switchMap(
chats => Observable.from(chats)
.mergeMap( chat => this.msgService.getLastMessage(chat['id'])
.map( lastMessage => this.containsUnreadMessages(lastMessage, chat['lastPresence']) ) )
)
.filter( state => state === true )
.subscribe( (unread) => {
this.unread = true;
console.log('result ', res);
} );