javascript - RxJS Debounce 优先级

标签 javascript rxjs

我在想出这个流时遇到了问题。

我正在寻找类似 debounceTime 但具有优先级的东西。

因此,如果我有形状为 { type: 'a', priority: 2 } 的事件。这些事件需要几秒钟的时间去抖动,但不是发出最后一个事件,而是发出具有最高优先级的事件。

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


output stream:
-----------------------------------(b|3)---------------------(a|1)-----

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

最佳答案

您必须存储和更新具有最高优先级的项并映射到此highest 值,然后将其传递给debounceTime

let highest = null;
source$.pipe(
  map(v => highest = highest && highest.priority > v.priority ? highest : v),
  debounceTime(2000),
  tap(() => highest = null)
);

您可以创建自己的运算符,在 defer 的帮助下执行此操作。 defer 确保每个订阅者都有自己的 highest 变量,因为每个订阅者都将通过调用给定的工厂函数获得自己的新 Observable。

function debounceTimeHighest<T>(dueTime: number, getHighest: (curr: T, high: T) => T): MonoTypeOperatorFunction<T> {
  return (source: Observable<T>) => defer(() => {
    let highest: T = null;
    return source.pipe(
      map(item => highest = highest ? getHighest(item, highest) : item),
      debounceTime(dueTime),
      tap(() => highest = null)
    );
  });
}

// Usage
source$.pipe(
  debounceTimeHighest(2000, (v1, v2) => v1.priority >= v2.priority ? v1 : v2)
)

上面的代码是Typescript。如果您想要纯 Javascript,只需删除所有类型。

https://stackblitz.com/edit/rxjs-hitqxk

关于javascript - RxJS Debounce 优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57632656/

相关文章:

javascript - RxJS 需要使用默认值的 shareReplay

javascript - 嵌套的可观察对象仅在超时后传播错误

javascript - 使用 require js 导入 Monaco Editor

javascript - Mongoose - 使用嵌套模型更新插入文档

javascript - 如何将socket.io与两个文件一起使用?

javascript - 使用可拖动的 jQuery 方法并隐藏 div 上的滚动条?

angular - 使用 rxjs 将数据添加到 http 响应

RXJS 等待所有 Observables 完成并返回结果

javascript - 通过ajax发送php和js变量到php页面和mysql表

rxjs - RxJava/RxJs : How to merge two source observables but complete as soon as one of them completes