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

时间:2014-03-30 23:33:47

标签: javascript timeout settimeout momentjs

我正在使用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应用于我的具体情况?

2 个答案:

答案 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/