有没有一个在时间范围内选择最大值的去抖动版本? 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]),y) => x
); 

这里的附加值是不需要通过从其闭包中读取变量来修改间隔。在这里它可以保持“纯”状态,因为一旦数组流完成,zip将退订。