JavaScript:如何每隔一小时做一些事情?

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毫秒之类的事情并让它成为一个疯狂的循环.


Ram*_*rar 9

看看这个:

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)


Ste*_*fan 6

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)


Nie*_*sol 5

你可以做的是每分钟运行一次间隔,并检查时间是否:00在运行实际代码之前.


Mas*_*iri 5

高性能和简短的回答

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)