【问题标题】:Help chosing between settimeout and setinterval帮助在 settimeout 和 setinterval 之间进行选择
【发布时间】:2011-06-13 15:27:58
【问题描述】:

更新 2:

好的,看起来它在一分钟后第一次运行。如何让它在 onload 上运行,然后每分钟运行一次?

更新 1:

我试过了:var interval = setInterval(get_reported_incidents, 60000); 但没有任何反应。在get_reported_incidents(); 我只有一个alert("hello");

原始问题:

我想每分钟运行一个函数:

get_reported_incidents();

但我不确定哪种方法最适合这项任务;

settimeoutsetinterval

【问题讨论】:

  • 请正确格式化您的代码,即使它只有这么少。谢谢!
  • 你想分钟运行它,还是只是“大约每分钟一段时间”?
  • 大概就够了。在此应用程序中,准确性不是问题。
  • 当你使用setInterval时,它不会立即执行命令,它会等到第一个间隔。
  • 关于更新:setInterval 不会直接调用你的函数,首先需要等待超时过去,在这种情况下是 1 分钟。此外,在那里使用警报也不好,因为如果您未能在下一个函数调用之前关闭它们,您可能会在堆栈中等待多个警报

标签: javascript jquery settimeout setinterval


【解决方案1】:

这完全是个人喜好。 setInterval 有一些奇怪的边缘情况,当上一个时间间隔的代码在下一个时间间隔开始之前没有完成运行时会发生什么(如果你的时间间隔是每 分钟,这不是问题;间隔每秒,有时需要,有点棘手)。

我更喜欢链接的setTimeout 调用(每个调用都安排下一个调用),因为它们不能随你而去——你的代码总是必须明确地说“好的,下次再给我回电”。但正确编写的代码应该适用于任何一个。

链式setTimeout 调用也更适合异步操作,例如通过 ajax 轮询某些内容,因为您不会在 ajax 操作完成之前安排下一次超时。使用setInterval,因为ajax 调用是异步的,你最终可能会重叠它们。

【讨论】:

  • @oshirowanen:您引用的代码没有任何问题,除了使用 alert 如果您有任何计时器运行几乎总是一个坏主意(因为alert 会使解释器急停)。
  • 警报只是一个例子,函数中的实际脚本更复杂。似乎这个方法直到 60 秒才执行。所以我得到一个空白屏幕一分钟,然后我得到内容。如何立即获取内容,然后每分钟更新一次?
  • @oshirowanen:是的,没错:第一次“ping”直到间隔之后才会发生。要立即执行此操作,只需在调用 setInterval 之前直接调用您的函数。 (或者使用链式setTimeout 机制,您可以从一开始就直接调用您的函数来启动它。)
【解决方案2】:

使用setinterval 将是更自然的选择。如果您使用setTimeout,则必须从事件处理程序开始新的超时。

window.setInterval(get_reported_incidents, 60*1000);

【讨论】:

  • @oshirowanen:我已经测试了代码,它工作得很好。演示:jsfiddle.net/nEAj8
【解决方案3】:

setTimeout 在一段时间后运行一次命令。 setInterval 每隔一段时间运行一个命令。

所以,要每分钟运行一次get_reported_incidents,请使用setInterval

var interval = setInterval(get_reported_incidents, 60000);

【讨论】:

    【解决方案4】:

    setinterval 以给定的时间间隔执行一个函数。 settimeout 在指定的等待时间后执行一个函数,然后退出。

    如果您尝试每分钟执行一次类似 cron 的执行,您将需要使用 setinterval。

    请查看http://javascript.about.com/library/blstvsi.htm进行比较。

    【讨论】:

      【解决方案5】:

      递归地使用setTimeout。请参阅 here 了解更多关于为什么 setInterval 是一个糟糕选择的信息。

      function timeout (){
          get_reported_incidents();
          setTimeout(timeout, 1000 * 60);
      }
      
      timeout(); // start
      

      【讨论】:

      • setInterval 不是更好的选择吗?
      • @rocket 和 downvoters。请阅读this
      • 对于可重复的时间,您应该减去花费在 get_reported_incidents 上的时间
      • 我正在寻找链接。该死的东西在我身上消失了!
      • @Josiah:那篇文章谈到了setInterval 调用堆叠,但这是明确不应该发生的。如果在安排下一个处理程序时,前一个处理程序仍在执行,则应该跳过它。实现的效果如何是另一个问题。 (我也更喜欢setTimeout。)
      【解决方案6】:

      严格来说,setInterval() 设计用于重复事件,setTimeout() 用于一次性事件。

      但是您会发现setTimeout() 时间会逐渐“爬行”。我没有以 1 分钟的间隔尝试过,但是使用 1 秒的计时器,我发现它发生了很多。显示当前时间(精确到毫秒)的时钟将显示“现在”的毫秒值稳步增加。

      查看http://jsfiddle.net/alnitak/LJCJU/ 并调整间隔以了解我的意思!

      所以,为了最准确,我这样做:

      var timerHandler = function() {
          var interval = 60000;
          // do some stuff
          ...
      
          var now = new Date();
          var delay = interval - (now % interval);
          setTimeout(timerHandler, delay); 
      };
      

      如果您希望计时器事件与系统上的时钟同步启动,而不是“大约每分钟”在某个未指定的时间启动,这是理想的选择。

      【讨论】:

        【解决方案7】:

        显然setinterval 在您的情况下可能更容易维护

        get_reported_incidents(); //first call
        var interval = setInterval(get_reported_incidents, 60000);
        

        var interval;
        function timeout (){
            get_reported_incidents();
            interval=setTimeout(timeout, 60000);
        }
        timeout();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-14
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-29
          相关资源
          最近更新 更多