我昨天开始使用rxjs
。我想实现以下行为:
我希望我的缓冲区能够同时生成时间和自定义事件。
想象一下,我的缓冲区每生成2000毫秒(就像标准bufferWithTime
函数行为一样),对于某些特殊事件,会产生一个缓冲区并重新初始化计时器。
这是一个基本的表示:
缓冲区内容A
:[1, 2]
,B
:[3, 4, 5]
,C
:[6, 7]
,D
:{{ 1}}。
时间段[8, 9]
,A
,B
的持续时间相同,为2000毫秒。
时间段D
较短,因为触发了特殊事件C
并产生了缓冲区。
我该怎么做?
答案 0 :(得分:1)
你可以试试这个(jsfiddle)吗?
// Helper functions
function randomDelay(bottom, top) {
return Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom;
}
// Simulation of random sequence
var source$ = Rx.Observable
.range(1, 30)
.concatMap(function (x) {
return Rx.Observable.of(x).delay(randomDelay(10,500));
});
var intervalBetween = 1000; // should be 2000ms in your case
var dummyStart$ = Rx.Observable.return({});
var specialEvent$ = Rx.Observable.fromEvent(document, 'click');
var opening$ = dummyStart$.concat(specialEvent$).flatMapLatest(function(x){return Rx.Observable.timer(0, intervalBetween)});
var buffers$ = source$.buffer(opening$).skip(1);
source$.subscribe(function(x){console.log('source', x)})
buffers$.subscribe(function(buffer){
console.log('buffer', buffer);
});
这里的想法是使用buffer
运算符和签名Rx.Observable.prototype.window(windowBoundaries);
。这应该为您提供非重叠的缓冲区,它们与windowBoundaries
信号同步发送。
有一个小技巧(dummyStart
)立即用假specialEvent
启动计时器。这会产生一个空缓冲区作为第一个值,由skip(1)
删除。