RxJS优先反跳

Ric*_*ler 6 javascript rxjs

我在提出这个问题时遇到了麻烦。

我正在寻找的是类似debounceTime但优先的东西。

所以如果我有形状的事件{ type: 'a', priority: 2 }。这些事件需要经过几秒钟的去抖动处理,但不是发出最后一个事件,而是发出优先级最高的事件。

input stream:
------(a|1)--(b|3)---(c|2)-----------------------(a|1)-----------------


output stream:
-----------------------------------(b|3)---------------------(a|1)-----
Run Code Online (Sandbox Code Playgroud)

我尝试查看其他运算符window,并对最后一个事件的结果进行过滤,但这并不理想,因为window在固定节奏上工作,我希望计时器在第一个事件上像反跳一样启动。

dmc*_*dle 2

我将提供以下解决方案,基于使用来scan提供迄今为止最高的给定优先级排放,以供 考虑debounceTime()。请注意,扫描需要在每次成功反跳后重新考虑新数据,因此我使用运算符window()来分割发射,在每次发射后启动一个新的可观察窗口debounceTime()

这是代码沙盒

下面是 CodeSandbox 中的一些简化代码,显示了重要的部分:

const resetScan$ = new Subject();

source$.pipe(
  window(resetScan$),
  mergeMap(win$ => win$.pipe(
    scan((acc, cur) => acc.priority >= cur.priority ? acc : cur )
  )),
  debounceTime(debounceDelay),
  tap(() => resetScan$.next())
);
Run Code Online (Sandbox Code Playgroud)