我有一个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
我正在寻找一种运营商或某种方式来保持数据同步
答案 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
的这个签名很少被使用,但它应该是在可能的情况下,因为它更高效(避免创建额外的内部可观察和订阅)并且更具表现力。