2017-07-26 22 views
0

考虑下面的代码:取消先前的内观测量当一个新的更高阶的可观察被发射

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() - 包含所有聊天的元数据 原始数组: - 是可观察到的,从来没有完成

在SE cond mergeMap我正在调用函数getLastMessage()。 我需要观察这个可观察的,直到 getUserChatList()发出一个新项目,否则我会对同一个聊天的最后一个消息进行多次观察。

插图:

  1. getUserChatList发射:[chatMetaA:{},chatMetaB:{}]
  2. 代码经过getLastMessage,开始观察lastMessage饭店Chata和chatB
  3. 的聊天变化
  4. 一个所以包含聊天元数据的新版本getUserChatList发出新项目:[chatMetaA:{},chatMetaB:{}]
  5. 代码通过getLastMessage并开始观察chatA和chatB的lastMessage。所以我们现在看到的饭店Chata和chatB

两次最后消息,它会继续下去......

我的问题是,我怎么能取消观察上getLastMessage()一次新产品由getUserChatList()发出?我试着用开关,但无法管理,使其工作

+3

使用'switchMap'运营商 – martin

+0

@马丁,如果我用它代替第一mergeMap然后什么更改(我的问题仍然存在),如果我使用它而不是第二个mergeMap,那么我的代码只执行我的数组的最后一项,这不是我想要的 –

回答

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); 
    }); 
相关问题