2017-07-26 62 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); 
    }); 
相關問題