开发者问题收集

每 60 秒调用一次函数

2010-06-29
530433

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

setTimeout(function, 60000);

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

3个回答

如果您不介意 timer 内的代码是否比您的间隔时间更长,请使用 setInterval()

setInterval(function, delay)

这会反复触发作为第一个参数传入的函数。

更好的方法是将 setTimeout自执行匿名 函数一起使用:

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

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

jAndy
2010-06-29

使用

setInterval(function, 60000);

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

脚本部分(将自动启动)

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

以及带有停止按钮的 HTML 代码

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

更好地利用 jAndy answer 来实现轮询函数,该函数每 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.
    }
}
Om Shankar
2015-08-06