在特定时间(和日期)调用函数

时间:2016-09-01 19:27:22

标签: javascript jquery cordova

我正在使用jQuery mobile和cordova开发一个应用程序,我的应用程序中有一个倒计时(这是一个插件添加到我的项目中),我希望当这个计时器达到10秒时,会调用一个特定的函数。选项是我的倒计时每秒都要检查一次,但是对于一些性能问题是不可能做到的并且这不是很合理,因为我的倒计时可能会显示5天。另一种选择是使用setTimeout,但我认为这会降低性能。不会吗? 假设setTimeout(function{//function call}, 14400000)只需要4个小时,更不用说几天了。

如果确实降低了性能,我还有其他选择吗? 对于javascript或jQuery,node.js中是否有类似crone的东西,以便我们可以指定要调用的函数的时间和日期?

我的意思是如果我可以设置函数调用的时间和日期,例如2016-09-01 15:10:40

TNX

2 个答案:

答案 0 :(得分:1)

调用setTimeout只会导致性能损失微不足道。解决您所描述问题的最佳方法是计算当前时间与您希望执行代码的时间之间的毫秒数,并使用该值作为超时调用setTimeout。然而,正如@Vld所概述的那样,你必须注意:延迟参数被某些浏览器存储为32位整数,所以我们需要解决这个问题并定期重新创建超时直到我们达到我们想要的日期。

此外,您必须知道示例代码中futureDate参数的使用日期是UTC时区,因此请确保在使用之前将本地时间转换为UTC。一个好的图书馆可以使用Moment.js

以下是代码:

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!');
});

答案 1 :(得分:0)

  1. 每秒运行一个脚本没有明显的性能问题,只要执行的脚本与检查是否达到所需时间一样简单。
  2. 我没有发现使用setTimeout时遇到任何性能问题,您可以根据需要进行设置,但这绝对不会影响性能。