JavaScript:如何让setInterval()立即启动?

时间:2011-09-14 23:21:44

标签: javascript

我使用setInterval()函数每20秒调用一次函数。但是,我注意到的一件事是setInterval()第一次实际调用函数是在20秒(而不是在调用setInterval()时)。这是我目前的解决方法:

dothis();
var i = setInterval(dothis, 20000);

如果没有这个重复的代码,有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:30)

你的方法是正常的做法。

如果反复出现这种情况,您可以创建一个实用程序函数,首先执行处理程序,然后设置间隔:

function setIntervalAndExecute(fn, t) {
    fn();
    return(setInterval(fn, t));
}

然后,在您的代码中,您可以这样做:

var i = setIntervalAndExecute(dothis, 20000);

答案 1 :(得分:10)

除了使用setTimeout函数而不是setInterval之外,你可以创建一个匿名函数并立即调用它。

(function doStuff() {
    //Do Stuff Here
    setTimeout(doStuff,20000);
})();

这将执行该功能,然后在20秒内再次调用它。

请注意,根据您所希望的行为或某些情况下的性能,最好在setInterval上使用setTimeout。主要区别在于setInterval在超时结束时调用该函数,如果最后一次调用已完成执行或发生错误,则调用REGARDLESS。使用setTimeout这种方式可确保函数在计时器重置之前完成其执行。很多权衡都很明显,但在设计应用程序时要记住这一点。

编辑回应帕特里克dw对需要取消超时的担忧。最好的解决方案是不使用匿名函数,只需在声明后调用它

var timeout;
function doStuff() {
    //doStuff 
    timeout = setTimeout(doStuff,20000);
}
doStuff()

是的,这与OP试图避免的类似,但它确实不需要调用该函数然后调用setInterval函数,因此您保存了一行代码。您可以随时通过以下方式停止和启动该功能:

//Stop it
clearTimeout(timeout);

//Start it
doStuff();

答案 2 :(得分:3)

如果您的dothis函数没有其他需要返回值,您可以让它自行返回。

这将允许您同时调用并传递它。如果忽略返回值,它将是无害的。

function dothis() {
    // your code
    return dothis;
}

var i = setInterval(dothis(), 20000);

否则,你可以扩展Function.prototype来为你的所有功能提供一个调用和返回功能:

DEMO: http://jsfiddle.net/ZXeUz/

Function.prototype.invoke_assign = function() {
    var func = this,
        args = arguments;
    func.call.apply( func, arguments );
    return function() { func.call.apply( func, args ); };
};

setInterval( dothis.invoke_assign( 'thisArg', 1, 2, 3 ), 20000 );

// thisArg 1 2 3
// thisArg 1 2 3
// thisArg 1 2 3
// ...

这实际上增强了一些东西。它允许您传递一组参数。第一个参数将设置您正在调用的函数的this值,其余参数将作为常规参数传递。

因为返回的函数包含在另一个函数中,所以在初始调用和间隔调用之间会有相同的行为。