使用循环为一个函数设置多个超时



我使用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 1412712000毫秒,从现在开始

  • 结束星期五中午12:00开始的Inning 2412712000毫秒,从现在开始

  • 结束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
};

相关内容

  • 没有找到相关文章

最新更新