按照给定时间延迟执行的函数——setTimeout

15

在JavaScript中,是否有任何现成的东西(即不通过“插件”)允许我做类似于setTimeout的事情,但是我可以提供一个日期对象告诉它何时执行某些操作,而不是在多少毫秒后执行?

setToHappen(function () {
    alert('Wake up!');
}, new Date("..."));

是的,我知道我可以通过将new Date()减去我的现有日期对象(或者可能是反过来)来获取毫秒数,但我仍然想知道。

4个回答

32

你需要计算现在与你的日期对象之间的毫秒数:

function setToHappen(fn, date){
    return setTimeout(fn, date - Date.now());
}

NB 请注意 @calvin 的回答: 如果毫秒数大于2147483647,则此方法将无法工作。


1
你不需要乘以1000来获取毫秒吗? - Pim Jager
1
@Pim,不需要。'getTime()'返回00:00:00 1/1/1970和相应日期对象之间的毫秒数。 - James
啊,好的,我以为是秒。 - Pim Jager
请注意,这是“99%”正确的。如果系统时钟更改,则不会在“d”处执行“fn”。 - Chris
不仅更改系统时钟是一个问题。当您将系统发送到睡眠模式时,fn会在稍后的睡眠时间内执行。 - Sascha
太好了,谢谢。这对于Node.js应用程序非常完美。服务器不会进入睡眠状态或意外更改系统时钟。 - Gregory Bologna

11

9
不是,但您可以轻松编写自己的函数。只需计算当前时间与给定时间之间的毫秒差,并使用setTimeout调用该函数。
类似以下代码:
 setToHappen = function(fn, date){
  var now = new Date().getTime();
  var diff = date.getTime() - now;
  return setTimeout(fn, diff);
 }

编辑:已删除额外的乘以1000,感谢Chris指出!


这段文字提到了一个错误,已经被修正。它与IT技术无关。

3

您可以通过从日期中减去Date.now()来简单计算。

const myDate = new Date('...');
setTimeout(func, myDate - Date.now());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接