我使用Moment.js处理时间。 10个埋立对象(持续时间)已经被适当定义的开始和结束时间,如图这个问题的的jsfiddle 。
该脚本是指使用所述差一局结束时刻和现在之间定义必要的Timeout
一个函数要被设置endInning()
被调用。 这是一个循环处理10局中实现。
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小时递增的延迟,每个延迟是相同的。
结果:
上周五结束围垦1,12:00 PM,从现在 412712000毫秒。
上周五结束围垦2,下午12:00,从现在 412712000毫秒。
上周五结束围垦3,下午12:00,从现在 412712000毫秒。
......等等,直到围垦10。
什么是我的错误,我该如何解决?
编辑:
问与我此脚本的做法问题之后,我认为,这些问题/回答有关:
所以我的问题是:如何申请这种做法对我的具体情况?
与结束日期实际问题不属于超时(然而,这仍然是一个问题 ,他们)
第一 -您创建一个inning
的对象,而你需要创建10
因此,移动
var inning = new Object();
第一内部for
循环,这样您将创建10点局的对象,而不是一个。
第二 -你滥用moment
库对象
inning.start = beginning.moment.add("hours", (inningHours * x)); //WRONG
刚刚修改beginning.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);
}
从复制它的setTimeout在for循环不打印连续的值 ,如果我循环太多,因为每一个函数调用创建一个新的函数对象,我不会用它,它会占用大量内存,如果你是循环太多,替代方案要创建一个类状结构。 例如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
};