ES6版本,适用于NodeJS和所有现代浏览器 - 根据浏览器或服务器时钟在毫秒级别执行:
---------- 更新 ----------
功能
const doSomething = something => {
setTimeout(() => {
something()
doSomething(something)
}, 3600000 - new Date().getTime() % 3600000)
}
使用方法
// Do something at next full hour and repeat forever
doSomething(() => console.log('Full hour reached!'))
---------- 旧答案,更多控制 ----------
功能
const doSomething = (something) => {
let running = true
let nextHour = () => {
return 3600000 - new Date().getTime() % 3600000
}
let nextCall = setTimeout(() => {
something()
doSomething(something)
}, nextHour())
return {
next() { return running ? nextHour() : -1 },
exec() { something() },
stop() {
clearTimeout(nextCall)
running = false
},
start() {
clearTimeout(nextCall)
nextCall = setTimeout(() => {
something()
doSomething(something)
}, nextHour())
running = true
}
}
}
使用方法
// Do something at next full hour and repeat forever
doSomething(() => console.log('Full hour reached!'))
// Do something every full hour & stop it
let obj = doSomething(() => console.log('Will I ever execute? :/'))
obj.next() // Time to next execution in milliseconds
obj.next() / 1000 // Time to next execution in seconds
obj.next() / 1000 / 60 // Time to next execution in minutes
obj.stop() // Stop executing every full hour
obj.start() // Continue executing every hour
obj.exec() // Execute now