Я преобразовал ответ Сергея в JavaScript и думаю, что это должен быть последний путь.
var $button = $('#myButton').button();
$button
.toObservable("click")
.Take(1)
.Merge(Rx.Observable.Empty().Delay(2000))
.Repeat()
.Subscribe(function(){ console.log('clicked'); }
Насколько я понимаю, это решение действительно лучше, потому что оно не зависит от побочного эффекта, который делает его дажелучше с точки зрения компоновки.
Как отметил Сергей, вы могли бы даже пойти дальше и реализовать свой собственный комбинатор, например, так:
Rx.Observable.prototype.OneInTime = function(delay){
return this
.Take(1)
.Merge(Rx.Observable.Empty().Delay(delay))
.Repeat();
};
Таким образом, наш приведенный выше пример можно сократить до:
var $button = $('#myButton').button();
$button
.toObservable("click")
.OneInTime(2000)
.Subscribe(function(){ console.log('clicked'); });