间隔同步到时间

Interval synced to Time

我想间隔执行一个函数。是的,我可以使用 setInterval,但我需要将时间间隔同步到时间戳或其他东西。

就像我想在两个不同的设备上执行间隔一样,它们应该 运行 在完全相同的秒内,如果可能的话甚至在 ms 内。但是,如果我使用 setInterval 方法,则取决于我何时为脚本加注星标,这些间隔将被抵消。

我已经试过了,但有点奇怪。

setInterval(() => {
        if (new Date().getTime() % 1000 * 10 == 0) {
            console.log(new Date().toLocaleTimeString())
        }
    }, 1);

Like I want to execute the interval on two different devices and they should run in the exact same second or even ms if possible.

不能保证你能做到这一点,尤其是因为其中一台设备上的 JavaScript 线程可能在那一刻正忙于做其他事情(它甚至可能被占用几秒钟) .

除此之外,还有同步设备的问题。选项是:

  1. 您同时发送到两个设备的某种同步事件。您将 运行 您的代码响应从您的服务器接收到的同步事件。这自然会受到网络延迟的影响,它需要服务器发送事件(可能通过网络套接字),并且要遵守上述关于 JavaScript 线程正忙的警告。

  2. 依赖于同步到完全相同时间源的设备(例如,它们可能都使用 NIST 时间服务器或类似服务器)。如果您知道他们的时间对于您的目的而言足够同步,您可以安排您的计时器在精确的时刻触发,如下所示:

    // Fire at exactly 14:30 GMT on 2021-04-21
    const target = new Date(Date.UTC(2021, 3, 21, 14, 30)); // 3 = April, starts with 0 = Jan
    const delay = Date.now() - target;
    if (delay < 0) {
        // It's already later than that
    } else {
        setTimeout(() => {
            // Your code here
        }, delay);
    }
    

    BUT,同样,如果 JavaScript 线程在那一刻正忙,定时器回调将在 运行 之后,当线程空闲时.

    上面的代码安排了一个 单个 事件,但是如果你需要一个重复的事件,你可以执行相同的基本逻辑:确定你想要的下一个 date/time回调发生,找出现在和那时之间的毫秒数 (Date.now() - target),并在该毫秒数后安排回调。