我有一个obeservable序列,每次调用realease事件发生时我都会将该事件映射到一个http请求,该请求返回一些调用日志然后我会过滤并需要获取一个计数表单。问题是即使从http请求返回json的映射的obserbable和序列已经完成原始的fromEvent Observable也没有终止,所以count不会发出任何东西。每次http请求返回时我都需要计算过滤后的数量,不知道如何执行此操作。
var seq = Rx.Observable
.fromEvent(call realease event)
.flatMap(agentObj =>
Rx.Observable.fromPromise(callLogHelper.getUserCallLogs(agentObj.agentId))
)
.flatMap(logs => Rx.Observable.fromArray(logs))
.filter(log => log.callTime >= 210)
.count();
我尝试了一些非常有用的方法,包括user3743222,我非常感谢。这些包括扫描,采样,扩展和使用map和filter中的idx参数。我不断得到的主要问题是这些方法返回一个连续的运行总数,因为http请求可能在上次调用时有重复数据,每次返回http请求时都需要重置运行计数。
我最终只是将flatMap中请求的过滤值映射为简单的数组操作,然后只返回长度。我觉得这是一个hacky解决方案
var seq = Rx.Observable
.fromEvent(call realease event)
.flatMap(agentObj =>
Rx.Observable.fromPromise(callLogHelper.getUserCallLogs(agentObj.agentId))
)
.flatMap((logs) => {
var filteredLogs = logs.filter(log => log.callTime >= 210);
return Rx.Observable.of(filteredLogs.length);
})
答案 0 :(得分:2)
根据您提出的解决方案,它似乎更简单:
var seq = Rx.Observable
.fromEvent(call realease event)
.flatMap(
agentObj => callLogHelper.getUserCallLogs(agentObj.agentId),
(ao, logs) => logs.filter(log => log.callTime >= 210).length
);
答案 1 :(得分:0)
执行此操作的一种方法是使用Amazon Developer Forums运算符。在实践中,它将类似于:
var seq = Rx.Observable
.fromEvent(call realease event)
.flatMap(flatMap(agentObj =>
Rx.Observable.fromPromise(callLogHelper.getUserCallLogs(agentObj.agentId))
))
.flatMap(logs => Rx.Observable.fromArray(logs))
.filter(log => log.callTime >= 210)
.scan (function (count, _){return ++count},0);