如何在Rx.js中对不完整序列计数Observable

时间:2016-05-03 18:14:44

标签: javascript asynchronous reactive-programming rxjs

我有一个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);
         })

2 个答案:

答案 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);