RxJS 4:
我正在尝试存储一些值,并从第一个值存储时间起x秒后发出它们(换句话说,从websocket接收到的第一个值将切换计时器以存储输入值,然后在x秒后发出)。发出值后,计时器将停止并且不会发出任何值。在我从websocket收到新值之前,该循环再次开始。
原因是当前在我的应用程序中,它很可能每纳秒(Websocket数据)发出一个值,并且这会影响性能。我正在考虑存储我可以在x秒内收到的尽可能多的值,然后将这些值一起发出以一次完成一些批处理计算。
我已经尝试过了,但是似乎无法按预期工作。
public testObs = new Observable<any>();
public bufferStarted = false;
private subject = new Subject<any>();
webSocket.onmessage = ((event: any) => {
this.subject.next(event.data);
if(!bufferStarted) {
bufferStarted = true;
//start the buffer now
const startInterval = Observable.timer();
//emit value after 1s and close buffer
const closingInterval = val => {
console.log(`Buffer is open! Emitting value after 1s`)
bufferStarted = false;
return Observable.interval(1000);
}
this.testObs = this.subject.bufferToggle(startInterval, closingInterval);
}
}
在组件中,我订阅了testObs.subscribe((e) => ... )
。示例:通过websocket发送一个值,它启动了计时器,将打开缓冲区1秒钟。在1秒钟之内,从websocket收到了另外50个值。我期望组件中接收到51个值(数组长度为51)。但是我收到了可观察的是不确定的。感谢您的帮助。
答案 0 :(得分:0)
bufferTime
对您来说是一个不错的选择,它会在指定时间内将流项目分组。但是它仍然会发出一个空数组,即使没有源发出任何项目,因此您可以使用filter
来省略该空数组。这里是演示:
// assume a web socket stream
ws$;
const notEmpty = arr => Boolean(arr.length);
const grouped$ = ws$.pipe(bufferTime(1000), filter(notEmpty));
grouped$.subscribe(group => {
// group is an array of item from ws$
// do something here
});