我在提出这个问题时遇到了麻烦。
我正在寻找的是类似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在固定节奏上工作,我希望计时器在第一个事件上像反跳一样启动。
我将提供以下解决方案,基于使用来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)