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,这正是我想要的:)但是你只取最后一个值,这不是我想要的(我想要的是平均值)。谢尔盖更新了他的答案,并考虑到了你的评论:)好吧,我误解了,那么你肯定应该接受他的答案;)