每 60 秒调用一次函数

Calling a function every 60 seconds

提问人:Richard Knop 提问时间:6/29/2010 最后编辑:Samuel LiewRichard Knop 更新时间:10/28/2023 访问量:518320

问:

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

setTimeout(function, 60000);

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

JavaScript 函数 timer setinterval

评论

0赞 Nakilon 3/21/2023
这回答了你的问题吗?JavaScript:获取每分钟运行一次的代码

答:

82赞 Muneer 6/29/2010 #1

使用

setInterval(function, 60000);

编辑:(如果您想在启动后停止该功能)

脚本部分(将自动启动)

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

和带有按钮停止的 HTML 代码

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

评论

4赞 Anderson Green 12/1/2012
在这种情况下,在它开始重复后,您将如何阻止它重复?
9赞 Jamiec 6/29/2010 #2
setInterval(fn,time)

是你要追求的方法。

441赞 jAndy 6/29/2010 #3

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

setInterval(function, delay)

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

更好的方法是,与函数一起使用:setTimeoutself-executing anonymous

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

这样可以保证在执行代码之前不会进行下一次调用。在此示例中,我用作函数引用。这是为函数命名并在其中调用该函数的更好方法,因为在 ecmascript 5 中已弃用。arguments.calleesetTimeoutarguments.callee

评论

6赞 Andy E 6/29/2010
在代码完成执行之前,不可能进行下一次调用。计时器异步倒计时,但回调必须排队。这意味着您的回调可能会(并且可能会)在超过 60 秒后触发。
18赞 Gareth 6/29/2010
不同之处在于,setInterval 通常会在上一次迭代开始后 x 毫秒运行函数,而这里的方法将在上一次迭代结束后 x 毫秒运行下一次迭代
47赞 Clay 9/15/2011
就像给其他可能发现它的人的注释一样 -- 是一个合作伙伴函数,如果你想停止你的周期性函数调用,它会派上用场。clearInterval()setInterval()
7赞 Marco Marsala 8/6/2014
请注意,setInterval 在延迟 ms 后首次执行该函数。因此,如果你想立即执行函数,然后重复每个延迟,你应该这样做: func();setInterval(func, 延迟);
5赞 darth0s 11/8/2017
我只是不明白这个论点。我有getRates()函数,但是(function(){getRates(); setTimeout(getRates(), 10000);();不工作:/
7赞 christian louboutin sale 6/29/2010 #4

使用 window.setInterval(func, time)。

27赞 Om Shankar 8/6/2015 #5

更好地利用 jAndy 的答案来实现轮询函数,该函数每秒轮询一次,并在几秒钟后结束。intervaltimeout

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.
    }
}

评论

0赞 temuri 9/9/2015
您将如何从内部阻止轮询?sendHeartBeat
2赞 Dmytro Medvid 9/6/2016
这是一个很好的例子!当你使用计时器时,编写单元测试会很困难,但使用这种方法很容易
0赞 Mark Adamson 3/7/2018
好答案。请您更新new Date的一种用法,使它们保持一致,一种使用(new Date).getTime(),另一种使用(new Date()).getTime()。不过,两者似乎都工作正常
0赞 Patrizio Bekerle 10/21/2019
interval而且以毫秒为单位,不是吗?timeout
9赞 John Henckel 12/30/2015 #6

您只需在函数末尾调用 setTimeout。这会将其再次添加到事件队列中。您可以使用任何类型的逻辑来改变延迟值。例如

function multiStep() {
  // do some work here
  blah_blah_whatever();
  var newtime = 60000;
  if (!requestStop) {
    setTimeout(multiStep, newtime);
  }
}
-1赞 Gaurav Tripathi 3/7/2017 #7

有 2 种方式可以打电话-

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

  2. setInterval(functionName, 60000);

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

22赞 Optimum Creative 3/28/2017 #8

在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>

评论

0赞 Max 8/4/2017
这个数字或多或少每 12 秒更新一次——这不应该是一分钟吗?
2赞 Optimum Creative 8/4/2017
见评论 目前,它设置为每 6 秒更改一次。一分钟使用值 60000// Change Interval here to test. For eg: 5000 for 5 sec
1赞 srghma 11/29/2018 #9
// 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
  )
}
1赞 Vijay sadhu 3/7/2019 #10

在这里,我们安慰自然数 0 到......n(每 60 秒在控制台中打印一次下一个数字)。setInterval()

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

评论

1赞 vahdet 3/7/2019
关于它如何解决问题的一些解释会很棒。
2赞 user12449933 6/11/2020 #11

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)

4赞 Ankit Tiwari 6/11/2020 #12

每 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");
}

6赞 Madhusanka Edirimanna 7/16/2020 #13

一个很好的例子,其中订阅 a ,并使用 a 来停止永远循环:setInterval()clearInterval()

function myTimer() {

}

var timer = setInterval(myTimer, 5000);

调用此行以停止循环:

clearInterval(timer);
0赞 Andy 8/4/2021 #14

我倾向于调用一个包含循环函数的函数,该循环函数会定期调用 on 自身。setTimeout

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

timer();

1赞 Taylan Yuksel 11/9/2021 #15

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

因此,您可以像

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

有关更多详细信息,您可以查看 JavaScript 园

希望它对某人有所帮助。