代码之家  ›  专栏  ›  技术社区  ›  Sooraj

每天递减一次变量-Javascript

  •  7
  • Sooraj  · 技术社区  · 9 年前

    我试着每天减少一次变量。我为此编写了以下代码。

    var counter = 10; //any value
    
    setInterval(function() {
    
      counter = counter - 1;
    
    }, 86400000);

    有没有更好或更有效的方法来实现同样的目标?

    附言:-我不想使用任何图书馆。

    6 回复  |  直到 9 年前
        1
  •  2
  •   MarcoS    9 年前

    我看到你唯一错过的是设置 counter 变量
    我会写:

    var counter = 1000; // or any useful value
    
    setInterval(function() {
      --counter;
    }, 24 * 60 * 60 * 1000); // this is more self-explanatory than 86400000, and, being evaluated just once, it will have a tiny effect on the performace of the script
    
        2
  •  2
  •   smnbbrv    9 年前

    我看你写的方式没有任何问题。你使用间隔,好吧,但这不是你可能做的最坏的事 设置 变量值。

    您可能会想到另一种解决方案,它具有一个返回当前计数器的函数。

    var initialValue = 20000;
    
    function getCounter() {
      return initialValue - Math.floor(Date.now() / 1000 / 60 / 60 / 24);
    }
    
    console.log(getCounter());
    

    不同之处在于,它采用从UNIX时间开始的当前日期。每天的天数都会增加,因此函数的结果会减少1。

    但我仍然不明白这个解决方案如何能比你的更好。

        3
  •  0
  •   ryachza    9 年前

    我不完全确定为什么,但使用 setInterval 这样让我很不舒服。

    如果我需要这样做,我会使用类似这样的方法:

    var counter = 10;
    var timeout = new Date();
    setInterval(function(){
      if(new Date() >= timeout)
      {
        --counter; // the action to perform
        timeout = new Date(timeout.getTime() + 86400000); // update the timeout to the next time you want the action performed
      }
      console.log(counter);
    },1000); // every second is probably way more frequent than necessary for this scenario but I think is a decent default in general
    

    例如,这允许的一件事是将下一个超时设置为明天午夜,而不是锁定为“自上次执行以来的X秒”。关键是控制权的倒置——动作本身现在可以决定下次何时运行。

    虽然我可能会抽象出接受开始、间隔和操作的接口背后的细节。

        4
  •  0
  •   BryanGrezeszak    9 年前

    在我看来,最大的问题是,您必须让这个JS进程连续运行数天,才能让它做您需要的事情。这个世界并不完美,事情不需要偶尔重启……包括普通的JS过程。

    就我个人而言,我会存储一个起点的时间戳,然后(每当我需要知道经过了多少时间时)获取一个新的时间戳并使用它来计算它经过了多少天。这样,即使有什么事情打断了我的进程,我仍然可以回到我开始的地方。

        5
  •  0
  •   Tyler Dalton    9 年前

    也许用窗户。localStorage保存上次时间,如果大于60*60*24(一天中的秒数),则将上次时间设置为今天上午/现在/1:00,然后减小该值并保存。

    例子:

    var d = new Date();
    var mins = -(1+d.getHours())*60+d.getMinutes();
    var secs = mins*60+d.getSeconds(); // total seconds passed today from 1:00
    var now = d.getCurrentTime():
    var lastCheck = localStorage.getItem("lastCheck");
    if (!lastCheck)
    {
        localStorage.saveItem("lastCheck",now-secs); // beginning of today
    }
    var dayPassed = now - lastCheck > 24*60*60; // change to see if a day has passed
    if (dayPassed)
    {
        // save seconds
        localStorage.setItem("counter",localStorage.getItem("counter")-1);
        localStorage.saveItem("lastCheck",now-secs); // beginning of today
    }
    
        6
  •  -2
  •   jdgregson Mark    9 年前

    对我来说,检查自特定日期以来已经过去了多少天,并从计数器中减去该天数更有意义。主要是因为我不希望任何人在不需要或想连续几天重新加载的情况下打开同一页面。我会这样做:

    counter = 365; // original counter
    var start = new Date(2016, 03, 20); // original date
    var now = new Date();
    var days = Math.floor(Math.abs(start.getTime()-now.getTime())/(24*60*60*1000))
    counter -= days;
    

    这样,每次访问页面时,它都会正确递减。请注意,这会忽略闰日或时区的任何问题。上面的例子对我来说有一个360的计数器。如果你真的希望它打开几天,那么自动重新加载它:

    self.setTimeout(function(){document.location.reload()}, 86400000);