使用rxjs重放事件。或者如何将rxjs与滴答时间而不是挂钟时间一起使用

使用rxjs重放事件。或者如何将rxjs与滴答时间而不是挂钟时间一起使用,rxjs,observable,reactive-programming,Rxjs,Observable,Reactive Programming,我正在研究使用反应式编程,特别是在需要处理的大型事件流之上构建逻辑 这需要做很多与时间相关的事情,比如每秒生成一个合成事件。(人为的例子) 当事件实时进入时(即使用wallclock时间处理事件),这可以通过将间隔源放入eventstream中轻松解决。从上述链接: // RxJS v6+ import { mapTo } from 'rxjs/operators'; import { interval, merge } from 'rxjs'; //emit

我正在研究使用反应式编程,特别是在需要处理的大型事件流之上构建逻辑

这需要做很多与时间相关的事情,比如每秒生成一个合成事件。(人为的例子)

当事件实时进入时(即使用wallclock时间处理事件),这可以通过将间隔源放入eventstream中轻松解决。从上述链接:

    // RxJS v6+
    import { mapTo } from 'rxjs/operators';
    import { interval, merge } from 'rxjs';

    //emit every 2.5 seconds
    const first = interval(2500);
    //emit every 2 seconds
    const second = interval(2000);
    //emit every 1.5 seconds
    const third = interval(1500);
    //emit every 1 second
    const fourth = interval(1000);

    //emit outputs from one observable
    const example = merge(
      first.pipe(mapTo('FIRST!')),
      second.pipe(mapTo('SECOND!')),
      third.pipe(mapTo('THIRD')),
      fourth.pipe(mapTo('FOURTH'))
    );
    //output: "FOURTH", "THIRD", "SECOND!", "FOURTH", "FIRST!", "THIRD", "FOURTH"
    const subscribe = example.subscribe(val => console.log(val));
但是,我经常需要重播eventstreams,并以适当的顺序将合成事件合并到此流中。即:每个事件都有一个时间戳,合成事件需要正确地放置在eventstream中,以便生成的合并eventstream的时间戳保持(单调)增加。(即使用滴答时间处理事件)

这是按时间顺序合并N个事件流的更一般问题的一个具体案例

理想情况下,我会编写无需考虑挂钟时间或滴答时间的反应逻辑。然后,我将使用一些上下文来初始化rxjs,这些上下文表示我们在wallclock time或tick time中,如果是后者,则指向带有时间戳的event属性。Rxjs将整理其余部分,而无需处理自定义代码中的差异


您是否希望在原始排放之间以相同的时间重播这些流?您的主要挑战是将合成事件插入流中的正确位置吗?我希望尽可能快地重放流,因此跟踪时间比wallclock时间快得多。是的,在优雅地进行合成活动的同时将其放置在正确的位置是我最大的挑战。在这里,我的意思是说,我的所有(大部分)逻辑都不知道代码是在重放还是在现场,合成事件仍然是每一个时钟秒生成1个?编辑:我明白了,每秒1次,但不是实时的。看来你实现上下文无关反应逻辑的最大障碍是你在滴答时间的情况下必须面对的背压。你在使用吗?