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

时间:2017-01-26 22:18:01

标签: javascript time timeout alarm

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

            // 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);

3 个答案:

答案 0 :(得分:5)

只需设置第0个月(日期构造函数的第二个参数),然后就可以正常工作了。

请注意,当您在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不仅限于1月:

    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个月)由于其州here

答案 1 :(得分:4)

JavaScript使用32位整数来存储延迟值。这样就可以使用最大值2147483647。

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

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

如果您确实打算将此作为长期计时器,即使setTimeout没有最大值,这只有在用户在浏览器中打开您的页面时才有效他们等待警报的整个时间。

长期计时器的更好解决方案是在 localStorage 中存储闹钟应该关闭的时间(不是现在和之后的时间)在页面加载时,获取该值并将其与当前时间进行比较。

答案 2 :(得分:0)

因为Javascript中的月份是0。所以第一个月就是二月。我相信这个疯狂的功能是从Java借来的。