2016-05-04 54 views
0

我有一個obeservable序列,每次發生一個調用釋放事件時,我將該事件映射到一個返回callog json數組的http請求。Observable Race Condition,如何正確計時兩個Observables

我需要將發出呼叫事件的值與json數組結合起來。然而,當json數組返回了呼叫事件Observable發出了一個新的值。

const agentCallEventStream = Rx.Observable.fromEvent(call realease event) 
const agentCallLogStream = agentCallEventStream.flatMap((agentObj) => { 
     return Rx.Observable.fromPromise(callLogHelper.getUserCallLogs(agentObj.agentId)); 
     } 

     // I tried this 
    const callLogMerged = agentCallLogStream.combineLatest(agentCallEventStream) 

// but the event data returned is newer than the call log data returned 

進出口尋找運營商或一些方法來保持數據同步

+0

你能用輸入和期望輸出做一個大理石圖嗎? – user3743222

回答

1

如果要合併生成的承諾一樣agentObj,你可以在選擇功能直接執行它。你會從SO的問題找到一個很好的例子:RxJs avoid external state but still access previous values

agentCallEventStream.flatMap((agentObj) => 
       {  
        Rx.Observable.fromPromise(callLogHelper.getUserCallLogs(agentObj.agentId)) 
        .map(function (promiseValue){return { 
         promise : promiseValue, 
         agentObj : agentObj 
         }}); 
       } 

如果這不是你想要的,你應該在一個大理石圖什麼是輸入和預期產出明確規定。

UPDATE:以下paulpadniels評論,這裏是一個較短的版本使用flatMap與結果選擇功能:

agentCallEventStream.flatMap( 
    (agentObj) => Rx.Observable.fromPromise(callLogHelper.getUserCallLogs(agentObj.agentId)), 
    (promiseValue) => {promise : promiseValue, agentObj : agentObj} 
) 

真理是flatMap這個簽名是很少使用,但因爲它是它應該是在可能的情況更高性能(避免創建額外的內部可觀察性和訂閱)和更具表現力。

+0

多數民衆贊成什麼即時通訊尋找,現在在大理石圖上工作,並將提供一個爲未來的問題,謝謝 – TimCodes

+0

提示:您可以簡化和使用'flatMap'的二級選擇器,而不是嵌套'地圖' – paulpdaniels

+0

感謝小費。更新了代碼示例 – user3743222

相關問題