gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:32:18 27 4
gpt4 key购买 nike

我正在使用 Moment.js处理时间。 10 局对象 (durations) 已正确定义开始和结束时间,如 this question's JSFiddle 所示.

此脚本旨在使用 difference 在 Inning end 时间和 present 之间定义为函数 endInning() 设置的必要 Timeout 被调用。这是在处理 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,距离现在 412712000 毫秒。

  • 第 2 局结束于星期五 中午 12:00,从现在开始 412712000 毫秒。

  • 第 3 局星期五中午 12:00 结束,从现在开始 412712000 毫秒。

  • ...以此类推,直到第 10 局。


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


编辑:

在问了与我使用此脚本的实践相关的问题后,我认为这些问题/答案是相关的:

所以我的问题变成了:我如何申请this practice我的具体情况?

最佳答案

结束日期的实际问题不属于超时(但是,这仍然是一个问题)

首先 - 您创建了一个 inning 对象,而您需要创建 10 个

所以,移动

var inning = new Object();

在第一个 for 循环中,这样您将创建 10 个 inning 对象而不是一个。

second - 你误用了 moment 库对象

inning.start = beginning.moment.add("hours", (inningHours * x)); //WRONG

你只是修改了 beginning.moment 变量,这不是你想要达到的目标!

在javascript中,所有对象都是通过引用传递 https://stackoverflow.com/a/16880456/870183

因此,您必须创建新的 moment 对象,然后对其进行修改。

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/

关于javascript - 使用循环为函数设置多个超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22751323/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com