监听并存储值,并从第一个值存储时间起x秒后发出?

时间:2019-03-11 12:22:28

标签: angular typescript rxjs

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)。但是我收到了可观察的是不确定的。感谢您的帮助。

1 个答案:

答案 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
});