我正在使用该setInterval()函数每 20 秒调用一次函数。但是,我注意到的一件事是它第一次setInterval()实际调用该函数是在 20 秒(而不是何时setInterval()被调用)。这是我目前的解决方法:
dothis();
var i = setInterval(dothis, 20000);
有没有办法在没有这个重复代码的情况下实现这一目标?
我正在使用该setInterval()函数每 20 秒调用一次函数。但是,我注意到的一件事是它第一次setInterval()实际调用该函数是在 20 秒(而不是何时setInterval()被调用)。这是我目前的解决方法:
dothis();
var i = setInterval(dothis, 20000);
有没有办法在没有这个重复代码的情况下实现这一目标?
你的方法是正常的做法。
如果反复出现这种情况,您可以创建一个实用程序函数,该函数首先执行处理程序,然后设置间隔:
function setIntervalAndExecute(fn, t) {
fn();
return(setInterval(fn, t));
}
然后,在您的代码中,您可以这样做:
var i = setIntervalAndExecute(dothis, 20000);
您可以创建一个匿名函数并立即调用它,除非您使用 setTimeout 函数而不是 setInterval。
(function doStuff() {
//Do Stuff Here
setTimeout(doStuff,20000);
})();
这将执行该函数,然后在 20 秒内再次调用它。
请注意,根据您想要的行为或在某些情况下的性能,最好使用 setTimeout 而不是 setInterval。主要区别在于 setInterval 在超时结束时调用该函数,如果最后一次调用已完成执行或发生错误,则不管。使用 setTimeout 这种方式可确保函数在计时器重置之前完成其执行。许多权衡是非常明显的,但在设计应用程序时牢记这一点是件好事。
编辑响应 patrick dw 对需要取消超时的担忧。最好的办法是不使用匿名函数,只在声明后调用
var timeout;
function doStuff() {
//doStuff
timeout = setTimeout(doStuff,20000);
}
doStuff()
是的,这类似于 OP 试图避免的情况,但它确实不需要调用该函数然后调用 setInterval 函数,因此您可以节省一行代码。您可以通过以下方式随时停止和启动该功能:
//Stop it
clearTimeout(timeout);
//Start it
doStuff();
如果您的dothis函数不需要返回值,您可以让它返回自身。
这将允许您同时调用和传递它。如果以其他方式忽略返回值,它将是无害的。
function dothis() {
// your code
return dothis;
}
var i = setInterval(dothis(), 20000);
否则,您可以扩展Function.prototype为所有函数提供调用和返回功能:
演示: 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您正在调用的函数的值,其余参数将作为常规参数传递。
由于返回的函数包含在另一个函数中,因此初始调用和间隔调用之间的行为相同。