【问题标题】:call a function on specific time(and date)在特定时间(和日期)调用函数
【发布时间】:2016-09-01 19:27:21
【问题描述】:

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

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

我的意思是,如果我可以设置函数调用的时间和日期,例如在 2016-09-01 15:10:40 上,那就没问题了

tnx

【问题讨论】:

  • 如果你每隔 1s 做一个间隔滴答,(这里说前端)你可能关心什么性能?
  • 另外,你为什么不喜欢:(伪)如果日期正确 > 检查时间 > 如果时间正确 > 做事。如果您担心确切的日期,则永远不要使用客户端日期时间,因为它可能会被伪造更改操作系统的日期时间。

标签: javascript jquery cordova


【解决方案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!');
});

【讨论】:

  • 您发布的示例实际上不起作用。您可以提前设置的最长时间是2147483647 milliseconds,大约是 24 天。因此,如果您想在未来将其设置为“远”,请确保它在大约三周到三周半之内。
  • 我认为这不是真的。 setTimeout 的 delay 参数似乎没有任何限制(见developer.mozilla.org/en-US/docs/Web/API/WindowTimers/…),所以可以设置为 JavaScript 支持的最大数值,即 1.7976931348623157e+308。这应该能带你走得足够远。
  • 链接答案中的文字实际上来自您现在链接我的文章。检查页面底部的“最大延迟值”标题下。
  • @Vld:我错过了参考资料中的那部分,我错误地认为延迟是 JS 数字类型。对此表示歉意。我更新了我的答案以解决此限制。
【解决方案2】:
  1. 每秒运行一个脚本不会有明显的性能问题,只要执行的脚本就像检查它是否达到所需时间一样简单。
  2. 我没有发现使用setTimeout 有任何性能问题,您可以随意设置它,绝对不会影响性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 2021-03-03
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2012-05-27
    • 2023-04-01
    相关资源
    最近更新 更多