我正在使用Moment.js来处理时间。 10个对象(持续时间)已正确定义了开始和结束时间,如this question's JSFiddle所示。
此脚本旨在使用Inning 结束时间与现在之间的 difference 来定义必要的{要为要调用的函数Timeout
设置{1}}。这是在一个循环中实现的,以处理10局。
endInning()
但是,不是导致延迟增加12小时,而是每次延迟都相同。
结果:
从现在结束星期五,中午12:00, 412712000 ms Inning 1 。
在现在 星期五,中午12:00, 412712000 ms结束第二次。
现在 星期五,中午12:00, 412712000 ms结束 Inning 3 。
......等等,直到Inning 10。
我的错误是什么?如何解决?
编辑:
在使用此脚本询问与我的实践相关的问题后,我认为这些问题/答案是相关的:
所以我的问题变成了:如何将this practice应用于我的具体情况?
答案 0 :(得分:1)
function doSetTimeout(i) {
setTimeout(function() { alert(i); }, 100);
}
for (var i = 1; i <= 2; ++i) {
doSetTimeout(i);
}
从setTimeout in for-loop does not print consecutive values复制了它 我不会使用它,如果我循环太多,因为每个函数调用正在创建一个新的函数对象,如果你循环太多将是内存密集型,替代方法是创建类似结构的类。 例如http://www.phpied.com/3-ways-to-define-a-javascript-class/
function Inning(x) {
this.x= x;
}
Inning.prototype.onTimeOut = function() {
// do your thing with this.x
};
答案 1 :(得分:1)
结束日期的实际问题不属于超时(但是 仍然存在问题)
首先 - 您在创建10时创建了一个inning
对象
所以,移动
var inning = new Object();
在第一个for
循环内,这样你就可以创建10个局对象,而不是一个。
第二次 - 您误用了moment
库对象
inning.start = beginning.moment.add("hours", (inningHours * x)); //WRONG
你只是修改了begin.moment 变量,这不是你想要达到的目标!
在javascript中,所有对象都通过引用传递 https://stackoverflow.com/a/16880456/870183
因此,您必须创建新的时刻对象然后进行修改。
inning.start = moment(beginning.moment).add("hours", (inningHours * x)); //correct
第三次 - 超时问题。对于每个超时,我们需要使用另一个x变量
创建另一个函数对我来说很难理解闭包,所以继续努力吧。 https://stackoverflow.com/a/111200/870183
让我们创建一个将返回另一个函数的函数
function endInningFunc(x){
return function () {
endInning(x)
}
}
然后我们将传递新功能,其中x将被锁定&#34;其价值至setTimeout
setTimeout(endInningFunc(x), timeTillEnd);
最后一件事,不要使用全局变量! http://www.webdevelopersnotes.com/tutorials/javascript/global_local_variables_scope_javascript.php3
例如for (var x=0);
最后,工作实例。 http://jsfiddle.net/LmuX6/13/