在RxJS中,对一段时间内的事件进行计数,并每秒产生一次总和
Count events over a period of time and yield the sum once every second in RxJS
是否有可能在一段时间内计数事件并在RxJS中每秒产生一次总和?我有一个连续不断的事件流。每隔1秒,我希望获得过去5分钟窗口内的事件总数。这个想法是用它来填充一个实时图。
我知道如何用传统的方式做到这一点,但是我真的很想了解如何用响应式编程来做到这一点。
我是这样处理的。
创建一个可观察对象,它只计算接收到的事件数量,并将其作为运行总数(通过scan
)发出。创建第二个可观察对象,它只是延迟5分钟的运行总数。创建第三个可观察对象,从第一个可观察对象中减去延迟的可观察对象。这将产生小于5分钟的事件总数。创建最后一个可观察对象,每秒对第三个可观察对象进行一次采样。
const totalLast5Minutes = eventSource.publish(events => {
const runningTotal = events
.scan((e, total) => total + 1, 0)
.startWith(0);
const totalDelayed5Minutes = runningTotal
.delay(5000 * 60)
.startWith(0);
return Rx.Observable
.combineLatest(total, totalDelayed5Minutes, (t, td) => t - td);
});
// only sample the value once per second
Rx.Observable
.interval(1000)
.withLatestFrom(totalLast5Minutes, (interval, total) => total)
.subscribe(total => console.log(`total=${total}`));
这里有另一种我认为可能更简单的方法。你可以使用windowWithTime——参见ReactiveX和RxJS文档。你可以创建重叠的窗口,所以你可以有一个5分钟的事件窗口,然后是另一个5分钟的事件窗口,一秒后开始,再过一秒,等等。
如果计算每个窗口的计数,您将得到一系列5分钟事件的计数,间隔一秒。它看起来像这样:
source.windowWithTime(5 * 60000, 1000) // create 5 minute windows, one second apart
.flatMap(window => window.count()) // take each window and get the count once it completes (after 5 minutes)
.subscribe(count => console.log(count));
我已经用它来做你所说的——在一个不间断的事件流中获得一个时间窗口内的事件速率。通过使窗口重叠,您正在生成流上活动的移动平均。
相关文章:
- Canvas+svg路径动画,在路径中的特定点暂停一段时间,然后继续
- 如何在设定的时间间隔内一次只显示一个图像
- 收集一段时间内的EMG数据.建议JS
- 在一段时间内切换文本
- 如何停止字幕文本一段时间,然后继续
- HTTP服务器在一段时间后停止(Node.js)
- 一段时间后调用函数,但只调用一次
- 视频.JS - 一次在确切时间触发多个事件
- 为什么将 ng-select 替换为自定义指令会导致$http请求不会每隔一段时间发送一次
- 如果通过 ajax 调用 PHP 页面需要一段时间才能运行/返回(并且它设置了会话变量),则第二次 ajax 调用会看到
- 在页面加载时禁用 CSS 动画,但每隔一段时间工作一次
- JAVASCRIPT/JQuery如何在一次以上的时间内执行
- 如何在浏览器中使用F12控制台在javascript中每隔一段时间执行一次
- 不要做不止一次,要做一段时间,但不要做
- 如何使setInterval在一段时间后或多次操作后停止
- 在RxJS中,对一段时间内的事件进行计数,并每秒产生一次总和
- oidc-client CheckSessionIFrame正确触发一次,然后每隔一段时间失败一次
- 火灾调整事件一次不基于时间
- Javascript-在只运行一次脚本之前等待一段时间
- Javascript进度条不更新'在飞行',而是一次一次进程完成