Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript rxjs-缓冲流直到函数返回true_Javascript_Rxjs - Fatal编程技术网

Javascript rxjs-缓冲流直到函数返回true

Javascript rxjs-缓冲流直到函数返回true,javascript,rxjs,Javascript,Rxjs,我有一个不断增加的数字流,我想对其进行子采样。给定一个常数sampleinterval,我希望缓冲流,直到第一个缓冲值和最后一个缓冲值之间的差值大于或等于interval。然后它将发出这个数组,与操作符非常相似 我已经搜索了不同的rxjs操作符,但不知道如何实现这一点。bufferUntil操作符是完美的,但似乎不存在。我如何实现这一点 例如: const interval = 15; //example stream would be: 5, 10 , 15, 20, 25, 30.. Ob

我有一个不断增加的数字流,我想对其进行子采样。给定一个常数sample
interval
,我希望缓冲流,直到第一个缓冲值和最后一个缓冲值之间的差值大于或等于
interval
。然后它将发出这个数组,与操作符非常相似

我已经搜索了不同的rxjs操作符,但不知道如何实现这一点。
bufferUntil
操作符是完美的,但似乎不存在。我如何实现这一点

例如:

const interval = 15;
//example stream would be: 5, 10 , 15, 20, 25, 30..

Observable.pipe(
   bufferUntil(bufferedArray => {
       let last = bufferedArray.length - 1;
       return (bufferedArray[last] - bufferedArray[0] >= interval);
   })
).subscribe(x => console.log(x));

//With an expected output of [5, 10, 15, 20], [ 25, 30, 35, 40],..

可以实现维护自定义缓冲区的运算符。将所有传入值推入缓冲区,在满足给定条件时发出缓冲区并重置它。使用
defer
为每个订户提供自己的缓冲区

函数bufferUntil(emitWhen:(currentBuffer:T[])=>boolean:OperatorFunction{
返回(来源:可观察)=>延迟(()=>{
let缓冲区:T[]=[];//自定义缓冲区
返回源管道(
点击(v=>buffer.push(v)),//向缓冲区添加值
switchMap(()=>emitWhen(buffer)→of(buffer):空),//满足条件时发出缓冲区
轻触(()=>buffer=[])//清除缓冲区
)
});
}