我使用setInterval()
函数每20秒调用一次函数。但是,我注意到的一件事是setInterval()
第一次实际调用函数是在20秒(而不是在调用setInterval()
时)。这是我目前的解决方法:
dothis();
var i = setInterval(dothis, 20000);
如果没有这个重复的代码,有没有办法实现这个目标?
答案 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
值,其余参数将作为常规参数传递。
因为返回的函数包含在另一个函数中,所以在初始调用和间隔调用之间会有相同的行为。