繁体   English   中英

setTimeout立即运行,而不是等待延迟值

[英]setTimeout runs immediately instead of waiting the delay value

我绝对感到困惑。 为什么该程序不使用我命名为“结果”的延迟号。 应该用用户发布的将来日期减去当前时间。 这最终将成为一个警报。 看看,运行代码。

  // Set a future time you want the alert() function to go off var eta_ms = new Date(2017, 1, 26, 17, 06).getTime(); document.write(Date.now() + "<br />"); document.write(eta_ms + "<br />"); var result = eta_ms - Date.now(); document.write("The Delay: " + result + "<br />" ); document.write(result + "<br />"); document.write(typeof (result) + "<br />"); setTimeout(function(){ alert("Hello"); }, result); 

只需设置Month 0(Date-constructor的第二个参数),它就应该可以正常工作。

并且请注意,在23:35(26.01.2017)之后运行此代码时, 结果将变为负数,因为将来必须始终设置eta_ms

希望这可以帮助:

    var eta_ms = new Date(2017, 0, 26, 23, 35).getTime();
    document.write(Date.now() + "<br />");
    document.write(eta_ms + "<br />");

    var result = eta_ms - Date.now();
    document.write("The Delay: " + result + "<br />" );
    document.write(result + "<br />");
    document.write(typeof (result) + "<br />");

    setTimeout(function(){ alert("Hello"); }, result);

为了避免将月份设置为0,更好的方法可能是以另一种方式设置将来时间( eta_ms ),以便某人只需更改此minutesInFuture变量即可更改eta_ms eta_ms以这种方式不限于一月:

    var minutesInFuture = 5;

    var eta_ms = new Date().getTime();
    eta_ms = eta_ms + minutesInFuture * 1000 * 60;

    document.write(Date.now() + "<br />");
    document.write(eta_ms + "<br />");

    var result = eta_ms - Date.now();
    document.write("The Delay: " + result + "<br />" );
    document.write(result + "<br />");
    document.write(typeof (result) + "<br />");

    setTimeout(function(){ alert("Hello"); }, result);

(第0个月) 这里的状态

JavaScript使用32位整数存储延迟值。 这样便可以使用2147483647。

这意味着您可以拥有的最长setTimeoutsetInterval延迟为2,147,483,647毫秒或24.85513480324074天。

您的价值最终为2,677,448,064,即从现在起31天( new Date(2017, 1, 26, 17, 06) 2017,1,26,17,06 new Date(2017, 1, 26, 17, 06)是2017年2月26日),并且比最大值大,因此它分解并尽快运行它可以。

如果您确实确实打算将其设置为一个长期计时器,并且即使setTimeout没有最大值,则仅当用户在等待警报的整个过程中保持您的页面在浏览器中打开时,此方法才起作用。

对于长期计时器,更好的解决方案是将警报应该发出的时间(不是现在到现在的时间)存储在localStorage并在页面加载时将其取值并将其与当前值进行比较时间。

因为在Javascript中,月份是从0开始的。 因此,第一个月是二月。 我相信这个疯狂的功能是从Java借来的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM