如何进行首次发生,然后将事件抑制2秒(RxJS)

Chr*_*oph 8 throttling system.reactive rxjs

我认为RxJS应该完全适合压制多次按键点击2秒.但是,我正在努力实施.

var $button = $('#myButton').button();
$button
    .toObservable("click")
    //.Throttle(2000) // Wouldn't fire the first event instantly :-(
    .Subscribe(function(){ alert('clicked'); }); 
Run Code Online (Sandbox Code Playgroud)

为方便起见,我已经创建了一个jsFiddle.你需要向下滚动这个小提琴,因为我只是粘贴Rx,因为我找不到CDN.

http://jsfiddle.net/cburgdorf/mUMFA/2/

Chr*_*oph 5

我将Sergeys的答案转换为JavaScript,并认为这应该是最后的方法.

var $button = $('#myButton').button();
    $button
        .toObservable("click")
        .Take(1)
        .Merge(Rx.Observable.Empty().Delay(2000))
        .Repeat()
        .Subscribe(function(){ console.log('clicked'); }
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这个解决方案实际上更好,因为它不依赖于副作用,这使得它在可组合性方面更加出色.

正如谢尔盖指出的那样,你甚至可以进一步实施自己的组合器,如下所示:

Rx.Observable.prototype.OneInTime = function(delay){
 return this
        .Take(1)
        .Merge(Rx.Observable.Empty().Delay(delay))
        .Repeat();
};
Run Code Online (Sandbox Code Playgroud)

所以我们上面的例子可以简化为:

var $button = $('#myButton').button();
    $button
        .toObservable("click")
        .OneInTime(2000)
        .Subscribe(function(){ console.log('clicked'); });
Run Code Online (Sandbox Code Playgroud)