是否有选择时间范围内最大值的去抖动版本? (RxJS)

is there a version of debounce that selects the maximum value in the time frame? (RxJS)

基本上就是标题。我已经合并了两个流,但它们都每秒发出一次,我只想每秒发射一次。我的合并流每秒有两个值,但我当前的去抖动方法不会注意哪个更大。

有什么解决办法吗? (即传递函数去抖动的方法)

这是我的代码:

var a = [11, 12, 14, 15, 18, 20];
var b = [1, 2, 8, 16, 43, 100];

const first = interval(1000).pipe(
  take(a.length),
  map(i => a[i])
);

const second = interval(1000).pipe(
  take(b.length),
  map(i => b[i])
);

const example = first.pipe(merge(second));

const example2 = example.pipe(
  debounce(() => interval(1))
);

我尝试过使用 scan 和 max,但它们似乎没有我想要的功能。

我真的不确定你真正想要的是什么,因为你的描述不是很清楚。所以,我会给你两种可能性,我们可以看看其中一种是否正确。

第一种是合并两个流并只发出每个流的最大值。这不需要任何时间,也不像去抖动。它只是将源可观察量配对。

zip(first, second).pipe(
  map(([x, y]) => Math.max(x, y))
).subscribe(console.log);

第二种方法是缓冲值一秒钟,然后发出缓冲值中的最大值。这种方法不会将源流配对。它不关心有多少流或它们发射的频率。一秒可能有 12 个值,下一秒可能有 1 个值。它只会发出最大的。

merge(first, second).pipe(
  bufferTime(1000),
  filter(buffer => buffer.length > 0),
  map(buffer => Math.max(...buffer))
).subscribe(console.log);

这两个做的事情非常不同,但对于您的特定情况可能有相似的输出。第一个更接近您的问题描述,第二个更接近您的标题描述。


顺便说一句,这里有一个更实用的方法来创建您的第一个和第二个流。

const first = zip(
  from([11, 12, 14, 15, 18, 20]),
  interval(1000),
  (x, y) => x
);

const second = zip(
  from([1, 2, 8, 16, 43, 100]),
  interval(1000),
  (x, y) => x
); 

这里的附加值是不需要通过从其闭包中读取变量来修改间隔。在这里它可以保留 'pure' 因为一旦 array-stream 完成 zip 将取消订阅。