我希望在生成新值时收到通知,但仅在自上一个值生成后经过一段时间后才会收到通知。
E.g。如果一个源开始产生值(在t = 0s)并且每秒产生新值10秒,则停止5秒然后再次开始(在t = 15s),假设窗口持续时间设置为小于5秒,我希望只收到有关t = 0和t = 15(生成它们之后)的值的通知。类似于油门,但每个新值重置窗口持续时间。
答案 0 :(得分:1)
这是匆忙完成的,但它似乎正在起作用:jsfiddle
我们的想法是从第一个值开始,以指定的持续时间进行去抖动,然后在去抖动后取下一个值。 source
必须分享,因为它会多次订阅。
var ta_message = document.getElementById('ta_message');
var ta_intermediary = document.getElementById('ta_intermediary');
var ta_result = document.getElementById('ta_result');
function emits ( who, who_ ) {return function ( x ) {
who.innerHTML = [who.innerHTML, who_ + " emits " + JSON.stringify(x)].join("\n");
};}
var count = 0;
var Xms = 1700;
var source$ = Rx.Observable
.fromEvent(document.getElementById('source'), 'click')
.map(function(){return ++count;})
.do(emits(ta_message, 'count'))
.share();
var firstNextItem$ = source$
.debounce(Xms)
.flatMapLatest(function(){return source$.take(1);})
.do(emits(ta_intermediary, 'first value after Xms pause'))
;
var result$ = Rx.Observable.merge(source$.take(1), firstNextItem$)
.do(emits(ta_result, 'result'))
;
result$.subscribe(function(){});