问题描述
基本上只是标题。我已经合并了两个流,但是它们每秒都发出一次,所以我只想每秒最多发送一次。我的合并流每秒包含两个值,但是我当前的去抖动方法不会关注哪个更大。
这是我的代码:
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将退订。