使用循环设置多个超时的功能(Using a loop to set multiple timeout

2019-10-19 17:21发布

我使用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。


什么是我的错误,我该如何解决?


编辑:

问与我此脚本的做法问题之后,我认为,这些问题/回答有关:

  • JavaScript的闭包内环路-简单实用的例子

  • 为什么不应该在JavaScript中环路内作出的功能呢?

所以我的问题是:如何申请这种做法对我的具体情况?

Answer 1:

与结束日期实际问题不属于超时(然而,这仍然一个问题 ,他们)

第一 -您创建一个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/



Answer 2:

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
};


文章来源: Using a loop to set multiple timeouts for a function