当发出新的高阶Observable时,取消先前的内部Observable

时间:2017-07-26 07:47:45

标签: rxjs rxjs5

请考虑以下代码:

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()发出一个新项目,否则我会对同一个聊天的最后一条消息进行多次观察。

插图:

  1. getUserChatList发出:[chatMetaA:{},chatMetaB:{}]
  2. 代码遍历getLastMessage并开始观察chatA和chatB的lastMessage
  3. 其中一个聊天更改因此getUserChatList发出了一个新项目,其中包含聊天元数据的新版本:[chatMetaA:{},chatMetaB:{}]
  4. 代码遍历getLastMessage并开始观察chatA和chatB的lastMessage。所以我们现在观察chatA和chatB的最后一条消息
  5. 它会继续......

    我的问题是,一旦getUserChatList()发出新项目,我怎么能取消对getLastMessage()的观察?我尝试使用switch但无法使其正常工作

1 个答案:

答案 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);
    } );