Javascript 对一段时间内的事件进行计数,并在RxJS中每秒生成一次总和

Javascript 对一段时间内的事件进行计数,并在RxJS中每秒生成一次总和,javascript,rxjs,Javascript,Rxjs,是否有可能在一段时间内对事件进行计数,并在RxJS中每秒生成一次总和?我有一个连续不断的事件流。每1秒我想得到过去5分钟内的事件总数。其思想是使用它来填充实时图形 我知道如何用传统的方法来实现这一点,但我真的很想了解反应式编程是如何实现的。以下是我如何解决这一问题的 创建一个可观察对象,仅统计接收到的事件数,并将其作为运行总数(通过扫描)。 创建第二个可观测值,该值仅为延迟5分钟的运行总数。 创建第三个可观察对象,它只是从第一个可观察对象中减去延迟的可观察对象。这将产生小于5分钟的连续事件总数。

是否有可能在一段时间内对事件进行计数,并在RxJS中每秒生成一次总和?我有一个连续不断的事件流。每1秒我想得到过去5分钟内的事件总数。其思想是使用它来填充实时图形


我知道如何用传统的方法来实现这一点,但我真的很想了解反应式编程是如何实现的。

以下是我如何解决这一问题的

创建一个可观察对象,仅统计接收到的事件数,并将其作为运行总数(通过
扫描
)。
创建第二个可观测值,该值仅为延迟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-请参阅和。您可以创建重叠的窗口,这样您可以有一个5分钟的事件窗口,然后是另一个5分钟的事件窗口,该窗口在一秒钟后开始,然后是另一秒钟,以此类推

如果您对每个窗口进行计数,您将获得一系列5分钟的事件计数,间隔1秒。它看起来像这样:

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

我用它来做你所说的事情——在一段时间内,在一个不间断的事件流中获取事件的速率。通过让窗口重叠,您将在流上生成一个活动的集合。

我不知道RxJs是什么,但是如果您真的想在最后5分钟输出总和,您将需要一个带有时间戳的缓冲区,以便您可以正确地删除5分钟以上的值。谢谢您,Brandon,它的工作非常有效。我也尝试过使用带有timeshift参数的缓冲区,它给出了相同的结果,但有一些缺点。您的解决方案甚至可以使用数据库存储中的初始数据进行初始化(因此在运行值“正确”之前没有延迟)。你为我节省了几个小时和头痛:)。如此简单却又如此强大。奇怪的是,要完成这个任务需要多少行普通的过程代码