gpt4 book ai didi

frp - 我的 Throttable EventStream 实现 - 是否多余?

转载 作者:行者123 更新时间:2023-12-02 15:05:45 26 4
gpt4 key购买 nike

主题:我有一个流(实际上是 Bacon.interval 的组合流和按钮单击 EventStreams),它触发 ajax 请求并解决手动和自动数据刷新的任务。

问题:在手动事件(单击按钮)之后,我需要重置计时器,因为两个立即更新看起来很难看。

我的解决方案:我创建了自己的 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())
}
})
}

问题:这种行为可以在没有自定义事件流的情况下完成吗?

更新(感谢@raimohanska的回答)基于@raimohanska的回答我也转换了我的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();

最佳答案

如果您有流 manualTriggerE,您可以添加在每个手动触发器上重置的定期更新,如下所示:

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

诀窍是flatMapLatest:只要发生手动触发,它就会重新启动定期更新。

关于frp - 我的 Throttable EventStream 实现 - 是否多余?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34994057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com