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.
这意味着您可以拥有的最长 setTimeout
或 setInterval
延迟是 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.
借来的
我百思不得其解。为什么这个程序不使用我得到的延迟编号,我将其命名为 "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.
这意味着您可以拥有的最长 setTimeout
或 setInterval
延迟是 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.
借来的