我使用Moment.js来处理时间。10 Inning对象(持续时间(已经正确定义了开始和结束时间,如本问题的JSFiddle所示。
此脚本旨在使用Inning结束时间和当前之间的差来定义要为要调用的函数endInning()
设置的必要Timeout
。这是在处理10个Innings的循环中实现的。
for (x = 0; x < 10; x++) { // for each of ten defined innings
// calculate the difference between the end of inning x and now
timeTillEnd = moment(Game.innings[x].start).diff(moment(now),"milliseconds");
// and set the necessary delay
setTimeout(function () {
endInning(x);
}, timeTillEnd);
}
然而,每次延迟都是相同的,而不是导致增加12小时的延迟。
结果:
结束在星期五中午12:00开始的Inning 1,412712000毫秒,从现在开始。
结束在星期五中午12:00开始的Inning 2,412712000毫秒,从现在开始。
结束Inning 3,周五中午12:00,412712000ms,从现在开始。
。。。等等,直到Inning 10。
我的错误是什么?我该如何解决
编辑:
在询问了与我使用该脚本的实践相关的问题后,我认为这些问题/答案是相关的:
循环中的JavaScript闭包——简单实用的示例
为什么不应该';我在Javascript中的循环中生成函数吗?
所以我的问题变成了:我如何将这种做法应用于我的具体情况?
结束日期的实际问题不属于超时(然而,这仍然是他们的问题(
首先-您创建了一个inning
对象,而您需要创建10个
所以,移动
var inning = new Object();
在第一个for
循环中,通过这种方式,您将创建10个局对象,而不是一个。
秒-您误用了moment
库对象
inning.start = beginning.moment.add("hours", (inningHours * x)); //WRONG
您只是修改了starting.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将被"锁定"为其值到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/
function doSetTimeout(i) {
setTimeout(function() { alert(i); }, 100);
}
for (var i = 1; i <= 2; ++i) {
doSetTimeout(i);
}
从for循环中的setTimeout复制它不会打印连续的值如果我循环太多,我不会使用它,因为每个函数调用都在创建一个新的函数对象,如果循环太多会占用大量内存,另一种选择是创建类结构。实例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
};