【问题标题】:Calling a function every 60 seconds每 60 秒调用一次函数
【发布时间】:2011-03-09 12:01:03
【问题描述】:

使用setTimeout()可以在指定时间启动函数:

setTimeout(function, 60000);

但如果我想多次启动该功能怎么办?每次经过一个时间间隔,我都想执行该函数(假设每 60 秒一次)。

【问题讨论】:

    标签: javascript function timer setinterval


    【解决方案1】:

    如果您不关心timer 中的代码是否会比您的时间间隔更长,请使用setInterval()

    setInterval(function, delay)
    

    这会一遍又一遍地触发作为第一个参数传入的函数。

    更好的方法是使用setTimeoutself-executing anonymous 函数:

    (function(){
        // do some stuff
        setTimeout(arguments.callee, 60000);
    })();
    

    这保证了在您的代码执行之前不会进行下一次调用。我在这个例子中使用了arguments.callee 作为函数参考。这是为函数命名并在 setTimeout 中调用它的更好方法,因为 arguments.callee 在 ecmascript 5 中已弃用。

    【讨论】:

    • 在代码完成执行之前不可能进行下一次调用。计时器异步倒计时,但回调必须排队。这意味着您的回调可能(并且可能会)在超过 60 秒后触发。
    • 不同之处在于setInterval一般会在上一次迭代的start之后x毫秒运行函数,而这里的方法会在上一次迭代之后x毫秒运行下一次迭代结束
    • 提醒其他可能会发现这一点的人 -- clearInterval()setInterval() 的合作伙伴函数,如果您想停止定期函数调用,它会派上用场。
    • 请注意setInterval在延迟毫秒后第一次执行该函数。所以如果你想立即执行函数,然后重复每个延迟,你应该这样做: func(); setInterval(func, delay);
    • 我只是不明白这个 arguments.callee 的事情。我有 getRates() 函数但是 (function(){getRates(); setTimeout(getRates(), 10000); })();不工作:/
    【解决方案2】:

    使用

    setInterval(function, 60000);
    

    编辑:(如果您想在时钟启动后停止时钟)

    脚本部分

    <script>
    var int=self.setInterval(function, 60000);
    </script>
    

    和 HTML 代码

    <!-- Stop Button -->
    <a href="#" onclick="window.clearInterval(int);return false;">Stop</a>
    

    【讨论】:

    • 在这种情况下,它开始重复后如何阻止它重复?
    【解决方案3】:

    更好地利用jAndyanswer实现轮询功能,每interval秒轮询一次,在timeout秒后结束。

    function pollFunc(fn, timeout, interval) {
        var startTime = (new Date()).getTime();
        interval = interval || 1000;
    
        (function p() {
            fn();
            if (((new Date).getTime() - startTime ) <= timeout)  {
                setTimeout(p, interval);
            }
        })();
    }
    
    pollFunc(sendHeartBeat, 60000, 1000);
    

    更新

    根据评论,更新它以使传递的函数能够停止轮询:

    function pollFunc(fn, timeout, interval) {
        var startTime = (new Date()).getTime();
        interval = interval || 1000,
        canPoll = true;
    
        (function p() {
            canPoll = ((new Date).getTime() - startTime ) <= timeout;
            if (!fn() && canPoll)  { // ensures the function exucutes
                setTimeout(p, interval);
            }
        })();
    }
    
    pollFunc(sendHeartBeat, 60000, 1000);
    
    function sendHeartBeat(params) {
        ...
        ...
        if (receivedData) {
            // no need to execute further
            return true; // or false, change the IIFE inside condition accordingly.
        }
    }
    

    【讨论】:

    • 如何停止sendHeartBeat 内的投票?
    • 这是一个很好的例子!当您使用计时器时,编写单元测试会更困难,但使用这种方法 - 很容易
    • 好答案。请您更新 new Date 的一种用法以使它们保持一致,一种使用 (new Date).getTime() 和另一种 (new Date()).getTime()。两者似乎都可以正常工作
    • intervaltimeout 以毫秒为单位,不是吗?
    【解决方案4】:

    在 jQuery 中你可以这样做。

    function random_no(){
         var ran=Math.random();
         jQuery('#random_no_container').html(ran);
    }
               
    window.setInterval(function(){
           /// call your function here
          random_no();
    }, 6000);  // Change Interval here to test. For eg: 5000 for 5 sec
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <div id="random_no_container">
          Hello. Here you can see random numbers after every 6 sec
    </div>

    【讨论】:

    • 数字或多或少每 12 秒更新一次 - 这不应该是一分钟吗?
    • 见评论// Change Interval here to test. For eg: 5000 for 5 sec 目前设置为每6秒更改一次。使用价值 60000 一分钟
    【解决方案5】:
    setInterval(fn,time)
    

    是你所追求的方法。

    【讨论】:

      【解决方案6】:

      您可以简单地在函数结束时调用 setTimeout。这会将其再次添加到事件队列中。您可以使用任何类型的逻辑来改变延迟值。例如,

      function multiStep() {
        // do some work here
        blah_blah_whatever();
        var newtime = 60000;
        if (!requestStop) {
          setTimeout(multiStep, newtime);
        }
      }
      

      【讨论】:

        【解决方案7】:

        【讨论】:

          【解决方案8】:

          每隔 2 秒调用一次 Javascript 函数,持续 10 秒。

          var intervalPromise;
          $scope.startTimer = function(fn, delay, timeoutTime) {
              intervalPromise = $interval(function() {
                  fn();
                  var currentTime = new Date().getTime() - $scope.startTime;
                  if (currentTime > timeoutTime){
                      $interval.cancel(intervalPromise);
                    }                  
              }, delay);
          };
          
          $scope.startTimer(hello, 2000, 10000);
          
          hello(){
            console.log("hello");
          }

          【讨论】:

            【解决方案9】:

            function random(number) {
              return Math.floor(Math.random() * (number+1));
            }
            setInterval(() => {
                const rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')';//rgb value (0-255,0-255,0-255)
                document.body.style.backgroundColor = rndCol;   
            }, 1000);
            <script src="test.js"></script>
            it changes background color in every 1 second (written as 1000 in JS)

            【讨论】:

              【解决方案10】:

              订阅setInterval() 并使用clearInterval() 停止永久循环的一个很好的例子:

              function myTimer() {
              
              }
              
              var timer = setInterval(myTimer, 5000);
              

              调用此行来停止循环:

              clearInterval(timer);
              

              【讨论】:

                【解决方案11】:
                // example:
                // checkEach(1000, () => {
                //   if(!canIDoWorkNow()) {
                //     return true // try again after 1 second
                //   }
                //
                //   doWork()
                // })
                export function checkEach(milliseconds, fn) {
                  const timer = setInterval(
                    () => {
                      try {
                        const retry = fn()
                
                        if (retry !== true) {
                          clearInterval(timer)
                        }
                      } catch (e) {
                        clearInterval(timer)
                
                        throw e
                      }
                    },
                    milliseconds
                  )
                }
                

                【讨论】:

                  【解决方案12】:

                  这里我们使用 setInterval() 控制台自然数 0 到 ......n(控制台中的下一个数字每 60 秒打印一次)

                  var count = 0;
                  function abc(){
                      count ++;
                      console.log(count);
                  }
                  setInterval(abc,60*1000);
                  

                  【讨论】:

                  • 稍微解释一下它如何解决这个问题会很棒。
                  【解决方案13】:

                  我喜欢调用一个包含循环函数的函数,该循环函数会定期对其自身调用 setTimeout

                  function timer(interval = 1000) {
                    function loop(count = 1) {
                      console.log(count);
                      setTimeout(loop, interval, ++count);
                    }
                    loop();
                  }
                  
                  timer();

                  【讨论】:

                    【解决方案14】:

                    我看到这里没有提到如果你需要在重复时将参数传递给你的函数setTimeout(myFunc(myVal), 60000);会导致在上一次调用完成之前调用函数的错误。

                    因此,可以像这样传递参数

                    setTimeout(function () {
                                myFunc(myVal);
                            }, 60000)
                    

                    更多详细信息可以查看JavaScript garden

                    希望它对某人有所帮助。

                    【讨论】:

                      【解决方案15】:

                      有两种调用方式-

                      1. setInterval(function (){ functionName();}, 60000);

                      2. setInterval(functionName, 60000);

                      上述函数将每 60 秒调用一次。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-08-06
                        • 1970-01-01
                        • 2011-11-06
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-01-09
                        • 2018-05-17
                        相关资源
                        最近更新 更多