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

setTimeout runs immediately instead of waiting the delay value

我百思不得其解。为什么这个程序不使用我得到的延迟编号,我将其命名为 "result"。它应该用用户发布的未来日期减去当前时间。这最终会成为警报。 随便看看,运行代码。

            // 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) 之后的代码 result 变为负值,因为您必须设置 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 个月)正如其状态 here

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 日),它大于最大值,因此它会崩溃并尽快运行。

如果您确实打算将其设为 long-term 计时器,即使 setTimeout 没有最大值,这也只有在用户保留您的在他们等待闹钟的整个过程中,页面在浏览器中打开。

long-term 计时器的更好解决方案是将闹钟应该响起的时间(而不是现在和那时之间的时间)存储在 localStorage 并在页面加载时,取出该值并将其与当前时间进行比较。

因为在 Java 脚本中月份是从 0 开始的。所以第一个月是二月。我相信这个疯狂的功能是从 Java.

借来的