Javascript 每x ms计算一个平均值
我有一个流,它发出一些数据Javascript 每x ms计算一个平均值,javascript,rxjs,rxjs5,Javascript,Rxjs,Rxjs5,我有一个流,它发出一些数据 const data$ = Rx .Observable .interval(500) .map(() => Math.random() * 100) 我想计算一段时间内产生的所有值的平均值(例如每秒) 如果数据$流发出-2-2-4,我希望生成的流是-2--3 您将如何使用rxjs(第5版)bufferTime实现这一点: Rx.Observable .间隔(500) .map(()=>Math.random()*100) .do(console
const data$ = Rx
.Observable
.interval(500)
.map(() => Math.random() * 100)
我想计算一段时间内产生的所有值的平均值(例如每秒)
如果数据$
流发出-2-2-4
,我希望生成的流是-2--3
您将如何使用
rxjs
(第5版)bufferTime
实现这一点:
Rx.Observable
.间隔(500)
.map(()=>Math.random()*100)
.do(console.log)
.缓冲时间(2000年)
.map(项目=>{
返回项目。减少((acc,cur)=>acc+cur,0)/items.length;
})
.采取(3)
.订阅(val=>{
console.log('平均值:'+val);
})
如果确实需要每秒捕捉一个值,那么Sergey Sokolov的答案可能是可以的。但比方说,它宁愿是每小时一次,
bufferTime
可能必须在内存中保留这段时间内的值。在这里,如果我理解你的问题,你不需要保留这些值
因此,这样做可能是一个更好的主意:
const { Observable } = Rx;
const tick$ = Observable.interval(2000);
const myObs$ = Observable
.interval(500)
.map(() => Math.random() * 100)
.do(x => console.log(`Emit ${x}`));
const finalObs$ = tick$
.withLatestFrom(myObs$)
.map(([_, val]) => val)
.do(x => console.warn(`Taken ${x}`));
// only to test
finalObs$.take(3).subscribe();
输出:
这里的每个console.log
都只是为了调试,但是在您的最终观察中,您只能从上面的屏幕截图中看到黄色的值
这是一个有效的Plunkr哦,太酷了,谢谢Sergey,这正是我想要的:)但是你只取最后一个值,这不是我想要的(我想要的是平均值)。谢尔盖更新了他的答案,并考虑到了你的评论:)好吧,我误解了,那么你肯定应该接受他的答案;)