javascript - 如何在 Rxjs 中对不完整序列进行 Observable 计数

标签 javascript asynchronous reactive-programming rxjs

我有一个可观察的序列,每次发生调用释放事件时,我都会将该事件映射到一个 http 请求,该请求返回一些调用日志,然后我对其进行过滤并需要获取计数表单。问题是,即使从 http 请求返回 json 的映射 oberbable 并且序列已完成,原始 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 ,对此我非常感激。其中包括扫描、采样、扩展以及在映射和过滤器中使用 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);
         })

最佳答案

根据您提出的解决方案,这样做似乎更简单:

var seq = Rx.Observable
        .fromEvent(call realease event)
        .flatMap(
          agentObj => callLogHelper.getUserCallLogs(agentObj.agentId),
          (ao, logs) => logs.filter(log => log.callTime >= 210).length
        );

关于javascript - 如何在 Rxjs 中对不完整序列进行 Observable 计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37011477/

相关文章:

javascript - 文本颜色的随机色调不起作用

javascript - Javascript:由用户输入分配变量时崩溃

c - 什么构成异步安全

javascript - 更智能的缓冲器

swift - FlatMapLatest 跳过触发,直到最新的可观察完成

javascript - JavaScript声明一个变量并在一个语句中使用逗号运算符?

javascript - WebStorm实时模板: how to create an 'export default from' live template/How to get current folder name?

objective-c - 拆分 RACSignal 以消除状态

node.js - async.js 方法内的 async.js 方法

asynchronous - 异步 SQLalchemy : accessing eagerly-loaded empty relationship triggers new lazy-load, 引发错误