Тема: У меня есть поток (фактически объединенный поток из Bacon.interval и кнопки clicksStreams), который запускает ajax-запрос и решает задачу ручного и автоматического обновления данных.My Throttable EventStream - это избыточно?
Задача: После ручных событий (нажатие кнопок) Мне нужно сбросить таймер, потому что два немедленных обновления выглядят уродливо.
Моего решение: Я создал свою собственную реализацию Bacon.interval, где опросы событий может быть сброшены http://jsfiddle.net/cvvkxveq/1/:
Bacon.dynInterval = function(time,resetter){
if(!time) return Bacon.once(new Bacon.Error("Invalid args"));
var ivId, lastTime = Date.now();
return time < 1 ? Bacon.once(new Bacon.Error("Invalid time")) : Bacon.fromBinder(function(sink) {
function setUpInterval(){
if(ivId) clearInterval(ivId);
ivId = setInterval(function(){
var n = Date.now();
var tdx = n - lastTime;
lastTime = n;
sink(new Bacon.Next(tdx));
},time);
}
setUpInterval();
if(resetter) resetter.onValue(setUpInterval);
return function() {
clearInterval(ivId);
sink(new Bacon.End())
}
})
}
Вопрос: Является ли такая behaivour может быть сделана без потока пользовательских событий?
Update (спасибо @raimohanska 's ответа) базирования на @raimohanska' s ответа я также converded моего sream ouUiE события (manualTriggerE) в собственность с начальным значением для достижения немедленного обновления начинается.
var quotesService = Bacon.constant({url:"quotes.php"});
var onUiE = $("#next_stock, #prev_stock, #refresh_quotes").clickE().map(".currentTarget.id");
var onUiP = onUiE.toProperty("");
var periodicUpdateE = onUiP.flatMapLatest(function(){ return Bacon.interval(3000)});
var manualPlusPeriodicP = onUiP.toEventStream().merge(periodicUpdateE);
var quotesStream = quotesService.sampledBy(manualPlusPeriodicP).ajax();