可观察的竞争条件,如何正确计时两个Observable

时间:2016-05-04 23:19:15

标签: javascript asynchronous reactive-programming rxjs

我有一个obeservable序列,每次发生一个call release事件时,我都会将该事件映射到一个返回callog json Array的http请求。

我需要将调用事件的值发出与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

我正在寻找一种运营商或某种方式来保持数据同步

1 个答案:

答案 0 :(得分:1)

如果要合并生成promise的相同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
                        }});
                 }

如果这不是您想要的,您应该在大理石图中清楚地指明输入和预期输出是什么。

更新:关注paulpadniels评论,这是使用带结果选择器功能的flatMap的较短版本:

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

真相是flatMap的这个签名很少被使用,但它应该是在可能的情况下,因为它更高效(避免创建额外的内部可观察和订阅)并且更具表现力。