间隔同步到时间
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 线程可能在那一刻正忙于做其他事情(它甚至可能被占用几秒钟) .
除此之外,还有同步设备的问题。选项是:
您同时发送到两个设备的某种同步事件。您将 运行 您的代码响应从您的服务器接收到的同步事件。这自然会受到网络延迟的影响,它需要服务器发送事件(可能通过网络套接字),并且要遵守上述关于 JavaScript 线程正忙的警告。
依赖于同步到完全相同时间源的设备(例如,它们可能都使用 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
),并在该毫秒数后安排回调。
我想间隔执行一个函数。是的,我可以使用 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 线程可能在那一刻正忙于做其他事情(它甚至可能被占用几秒钟) .
除此之外,还有同步设备的问题。选项是:
您同时发送到两个设备的某种同步事件。您将 运行 您的代码响应从您的服务器接收到的同步事件。这自然会受到网络延迟的影响,它需要服务器发送事件(可能通过网络套接字),并且要遵守上述关于 JavaScript 线程正忙的警告。
依赖于同步到完全相同时间源的设备(例如,它们可能都使用 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
),并在该毫秒数后安排回调。