2016-01-25 3 views
3

Тема: У меня есть поток (фактически объединенный поток из 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(); 

ответ

2

Если у вас есть поток manualTriggerE, вы можете добавить периодические обновления, которые сброшена на каждом ручном триггером так:

let periodicUpdateE = manualTriggerE.flatMapLatest(() => Bacon.interval(1000)) 
let manualPlusPeriodicE = manualTrigger.merge(periodicUpdateE) 

Хитрость заключается в flatMapLatest: она перезапускает периодические обновления всякий раз, когда руководство триггером имеет место.

Смежные вопросы