【问题标题】:Run code once a day每天运行一次代码
【发布时间】:2012-07-31 14:04:44
【问题描述】:

我只是想知道是否有可能有一个 javascript for 循环,它每天只迭代一次循环,即当日期更改时?

for(i=0; i < myArray.length; i++){

    alert(myArray[i]);

}

所以在上面的循环中,让它运行,然后冻结它或其他什么,直到数据发生变化,然后进行另一次迭代,然后继续这样做......你知道我的意思。

提前致谢!

【问题讨论】:

  • 你的代码会在 node.js 或其他服务器端环境或浏览器中运行吗?
  • 那么setInterval是个不错的选择。
  • @RayToal - 它怎么可能是一个不错的选择?每次刷新都会运行多次,而不是每天一次。
  • 好点 - 对于浏览器或任何客户端代理来说,一天确实是一个巨大的时间间隔。
  • @Tiwaz89 - 请重新考虑投票,因为选择的答案不太好

标签: javascript loops


【解决方案1】:

当您没有服务器时,使用localStorage 是最好的方法(因为用户可以更改计算机的时间并破坏您的逻辑,而使用服务器更难破解)

下面的方法更防弹:

// checks if one day has passed. 
function hasOneDayPassed()
  // get today's date. eg: "7/37/2007"
  var date = new Date().toLocaleDateString();

  // if there's a date in localstorage and it's equal to the above: 
  // inferring a day has yet to pass since both dates are equal.
  if( localStorage.yourapp_date == date ) 
      return false;

  // this portion of logic occurs when a day has passed
  localStorage.yourapp_date = date;
  return true;
}


// some function which should run once a day
function runOncePerDay(){
  if( !hasOneDayPassed() ) return false;

  // your code below
  alert('Good morning!');
}


runOncePerDay(); // run the code
runOncePerDay(); // does not run the code

【讨论】:

  • 在底部你写了runOncePerDay(); //run the code runOncePerDay(); //does not run the code 但它们是一样的吗?我错过了什么?
  • @jmfbot - 这只是一个演示,显示该函数每天只能运行一次,因此第二次调用不会alert,因为第二次调用hasOneDayPassed()将返回 true(直到 1 天过去)
【解决方案2】:

如果您希望某事以预定义的时间间隔发生,您可以设置超时/时间间隔: http://www.w3schools.com/js/js_timing.asp

例如:

var dayInMilliseconds = 1000 * 60 * 60 * 24;
setInterval(function() { alert("foo"); },dayInMilliseconds );

编辑:由于您提到代码将在浏览器中运行,因此假定浏览器至少运行 24 小时,否则将无法运行。

【讨论】:

  • 这基本上是正确的,尽管我认为 OP 希望它在当地时间午夜运行。如果是这种情况,您应该计算 millisecondsToMidnight
  • @nolegs 非常好,谢谢 nolegs。但正如 apsillers 所说,我不希望它从执行后每 24 小时运行一次。但每晚午夜重复。
  • 你可以在这里看到:stackoverflow.com/questions/8583694/… 这会给你几毫秒直到午夜,但浏览器显然仍然必须在午夜运行才能工作。
【解决方案3】:

实现它的最佳方法是创建一个持续 1 天的 cookie。 即使在网页或浏览器刷新后关闭,倒计时仍会继续..

setcookie($cookie_name, $cookie_value, time() + 86400, "/"); 

这意味着 86400 = 1 天

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 2020-07-02
    • 2012-10-03
    • 1970-01-01
    • 2012-01-26
    相关资源
    最近更新 更多