Javascript 在特定时间(和日期)调用函数
我正在用jQuery mobile和cordova开发一个应用程序,我的应用程序中有一个倒计时(这是一个添加到我的项目中的插件),我希望当这个计时器达到10秒时,调用一个特定的函数。第一个选项是每秒检查一次我的倒计时,但这是不可能做到的一些性能问题,这是不合理的,因为我的倒计时可能显示5天。另一个选择是使用setTimeout,但我认为这会降低性能。是吗? 假设Javascript 在特定时间(和日期)调用函数,javascript,jquery,cordova,Javascript,Jquery,Cordova,我正在用jQuery mobile和cordova开发一个应用程序,我的应用程序中有一个倒计时(这是一个添加到我的项目中的插件),我希望当这个计时器达到10秒时,调用一个特定的函数。第一个选项是每秒检查一次我的倒计时,但这是不可能做到的一些性能问题,这是不合理的,因为我的倒计时可能显示5天。另一个选择是使用setTimeout,但我认为这会降低性能。是吗? 假设setTimeout(函数{//function call},14400000)仅持续4小时,更不用说几天了 如果它确实降低了性能,我还
setTimeout(函数{//function call},14400000)
仅持续4小时,更不用说几天了
如果它确实降低了性能,我还有什么其他选择?
对于javascript或jQuery,node.js中是否有类似于crone的东西,以便我们可以指定调用函数的时间和日期
我的意思是,如果我可以设置函数调用的时间和日期,例如2016-09-01 15:10:40,那就可以了
tnx调用
setTimeout
的性能损失可以忽略不计。解决您描述的问题的最佳方法是计算当前时间与您希望在执行代码的时间之间的毫秒数,并使用该值作为超时调用setTimeout
。然而,正如@Vld所概述的,有一个问题你必须注意:延迟参数被一些浏览器存储为32位整数,因此我们需要解决这个问题,并定期重新创建超时,直到达到我们想要的日期
此外,您必须注意示例代码中用于futureDate
参数的日期位于UTC时区,因此请确保在使用之前将本地时间转换为UTC。你可以利用的一个好图书馆就是
代码如下:
function scheduleExecution(futureDate, callback) {
// Set an intermediary timeout at every 1 hour interval, to avoid the
// 32 bit limitation in setting the timeout delay
var maxInterval = 60 * 60 * 1000;
var now = new Date();
if ((futureDate - now) > maxInterval) {
// Wait for maxInterval milliseconds, but make
// sure we don't go over the scheduled date
setTimeout(
function() { scheduleExecution(futureDate); },
Math.min(futureDate - now, maxInterval));
} else {
// Set final timeout
setTimeout(callback, futureDate - now);
}
}
// This example uses time zone UTC-5. Make sure to use the
// correct offset for your local time zone
var futureDate = new Date("2020-09-01T17:30:10-05:00");
scheduleExecution(futureDate, function() {
alert('boom!');
});
setTimeout
,我看不到任何性能问题,您可以随意设置,绝对不会影响性能如果你每隔1秒打一次间隔,(在这里谈论前端)你可能会担心什么性能?另外,为什么不喜欢:(伪)如果是正确的日期>检查时间>如果是正确的时间>做事情。如果你担心的是一个确切的日期,你就不应该使用客户机的日期时间,因为它可能是伪造的,改变操作系统的日期时间。你发布的示例实际上是行不通的。您可以提前设置的最长时间约为24天。所以,如果你想在将来把它设为“远”,请确保它在三周内,三周半。我不认为这是真的。setTimeout的delay参数似乎没有任何限制(请参阅),因此可以将其设置为JavaScript支持的最大数值,即1.7976931348623157e+308。我在我的链接答案中的文字实际上是从你现在链接到我的文章中得到的。查看页面底部标题“最大延迟值”下的内容。@Vld:我没有看到参考资料中的那一部分,我错误地认为延迟是一种JS数字类型。对此表示歉意。我更新了我的答案来解释这个限制。