源发射速率快时的Rxjs缓冲区

源发射速率快时的Rxjs缓冲区,rxjs,rxjs5,Rxjs,Rxjs5,比如说,我有一个可观测的发射,有时是每秒x0发射(可能是50,60,…),有时只是每秒1或2次发射 现在,我如何缓冲那些快速发射,而仍然处理缓慢发射 我累的是: BufferTime需要一个时间跨度,所以即使一次发射,它也会被缓冲(加上BufferTime,量角器测试超时) BufferCount(x)在接收到所有x发射之前不会发射。听起来您需要类似于debounce+buffer的东西。最简单的实现是使用流的去抖动来触发相同流的缓冲区的发射。您可能希望共享流以防止重复订阅。下面是一个运行示例:

比如说,我有一个可观测的发射,有时是每秒x0发射(可能是50,60,…),有时只是每秒1或2次发射

现在,我如何缓冲那些快速发射,而仍然处理缓慢发射

我累的是:

BufferTime需要一个时间跨度,所以即使一次发射,它也会被缓冲(加上BufferTime,量角器测试超时)


BufferCount(x)在接收到所有x发射之前不会发射。

听起来您需要类似于debounce+buffer的东西。最简单的实现是使用流的去抖动来触发相同流的缓冲区的发射。您可能希望共享流以防止重复订阅。下面是一个运行示例:

const source=new Rx.Observable.create((o)=>{
让计数=0;
常量emit=()=>{
const timeout=Math.random()*1000;
设置超时(()=>{
o、 下一步(count++);
如果(计数<20){
发射();
}否则{
o、 完全();
}
},超时);
};
发射();
}).share();
const triggerBuffer=source.debounceTime(500);
subscribe((x)=>{console.log(x);})

正如bygrace所提到的,您要寻找的是
去盎司+缓冲区

在现代RXJS 6中,使用ES6 Typescript添加类型推断,我创建了一个定制的运算符函数来完成这项非常简单的工作,称为
bufferDebounce

type BufferDebounce=(debounce:number)=>OperatorFunction;
常量bufferDebounce:bufferDebounce=debounce=>source=>
新的可观察对象(观察者=>
source.pipe(缓冲区(source.pipe(debounceTime(debounce))).subscribe({
下一(x){
观察员:下一个(x);
},
错误(err){
观察者错误(err);
},
完成(){
observer.complete();
},
})
//[在500ms内无排放之前,尽可能多的源]
source.pipe(bufferDebounce(500)).subscribe(console.log);
您可以在这里看到一个工作示例


希望这对您和任何新来者都有帮助。

您是否描述了这一点:将发射保持X时间,如果在X过期之前有另一个发射进入,则将其缓冲。缓冲最长时间为Y,或者直到发射未在X之前进入(以先到者为准)所以慢发射会延迟X,快发射会延迟X和Y。基本上是缓冲的去盎司操作符。我不知道哪里是problem@martin正如bygrace所说,类似于去盎司,但用于缓冲(即返回数组中的值,而不忽略它们)听起来您可以使用
bufferTime(time,null,size)
。此选项最多可缓冲
size
项,或者最多可缓冲
time
。或者您可以使用
source.buffer(source.debounceTime(X))
,这样它会一直缓冲到执行解盎司。如果您能提供一个实际的示例,说明消息在流中传递的时间,以及您对如何缓冲消息的期望,这会有所帮助。