mat*_*los 2 javascript time timer setinterval
我想每小时执行一些JS代码.但我不能用
setInterval("javascript function",60*60*1000);
Run Code Online (Sandbox Code Playgroud)
因为我想每隔一小时做一次,我的意思是1点,2点,3点等等.我在想类似的东西
var d;
while(true) {
d = new Date();
if ((d.getMinutes() == '00') && (d.getSeconds() == '00')){
// my code here
}
}
Run Code Online (Sandbox Code Playgroud)
但它太慢而且效果不好.
请你提出任何想法
Her*_*key 10
我会发现它现在是几点,弄清楚它会持续多长时间,直到下一个整整一个小时,然后等待那么久.所以,
function doSomething() {
var d = new Date(),
h = new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours() + 1, 0, 0, 0),
e = h - d;
if (e > 100) { // some arbitrary time period
window.setTimeout(doSomething, e);
}
// your code
}
Run Code Online (Sandbox Code Playgroud)
检查e < 100只是为了确保你不会做setTimeout5毫秒之类的事情并让它成为一个疯狂的循环.
看看这个:
function to_be_executed(){
...
...
...
makeInterval();
}
function makeInterval(){
var d = new Date();
var min = d.getMinutes();
var sec = d.getSeconds();
if((min == '00') && (sec == '00'))
to_be_executed();
else
setTimeout(to_be_executed,(60*(60-min)+(60-sec))*1000);
}
Run Code Online (Sandbox Code Playgroud)
ES6 版本,适用于 NodeJS 和所有现代浏览器 - 根据浏览器或服务器时钟以毫秒执行:
- - - - - 更新 - - - - -
功能
const doSomething = something => {
setTimeout(() => {
something()
doSomething(something)
}, 3600000 - new Date().getTime() % 3600000)
}
Run Code Online (Sandbox Code Playgroud)
用法
// Do something at next full hour and repeat forever
doSomething(() => console.log('Full hour reached!'))
Run Code Online (Sandbox Code Playgroud)
---------- 具有更多控制权的旧答案 ----------
功能
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法
// 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
Run Code Online (Sandbox Code Playgroud)
高性能和简短的回答:
const runEveryFullHours = (callbackFn) => {
const Hour = 60 * 60 * 1000;
const currentDate = new Date();
const firstCall = Hour - (currentDate.getMinutes() * 60 + currentDate.getSeconds()) * 1000 - currentDate.getMilliseconds();
setTimeout(() => {
callbackFn();
setInterval(callbackFn, Hour);
}, firstCall);
};
Run Code Online (Sandbox Code Playgroud)
用法:
runEveryFullHours(() => console.log('Run Every Full Hours.'));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16357 次 |
| 最近记录: |