JavaScript:如何让setInterval()现在开始?
我正在使用setInterval()
函数每20秒调用一个函数。 然而,我注意到的一件事是,它第一次实际调用函数是在20秒(而不是当setInterval()
时)。 这是我目前的解决方法:
dothis(); var i = setInterval(dothis, 20000);
有没有办法实现这一点,而没有这个重复的代码?
你的方法是这样做的正常方式。
如果反复出现,你可以创build一个实用的函数来执行处理程序,然后设置时间间隔:
function setIntervalAndExecute(fn, t) { fn(); return(setInterval(fn, t)); }
然后,在你的代码中,你可以这样做:
var i = setIntervalAndExecute(dothis, 20000);
您可以创build一个匿名函数并立即调用它,除了使用setTimeout函数而不是setInterval。
(function doStuff() { //Do Stuff Here setTimeout(doStuff,20000); })();
这将执行该function,然后在20秒内再次调用它。
请注意,取决于您期望的行为或某些情况下的性能,最好使用setTimeout超过setInterval。 主要区别在于,只要超时结束,setInterval就会调用该函数,如果最后一次调用已经完成或发生错误,则返回无效。 使用setTimeout可以确保函数在定时器重置之前完成执行。 很多权衡是非常明显的,但在devise应用程序时要记住它是一件好事。
编辑为了回应帕特里克·dw关心有需要取消超时。 最好的解决scheme是不使用匿名函数,只是在声明后调用它
var timeout; function doStuff() { //doStuff timeout = setTimeout(doStuff,20000); } doStuff()
是的,这与OP试图避免的类似,但是它不需要调用函数,然后调用setInterval函数,因此可以保存一行代码。 您可以随时通过以下方式停止并启动该function:
//Stop it clearTimeout(timeout); //Start it doStuff();
如果你的函数没有其他的返回值需要,你可以让它自己返回。
这将允许您调用并同时传递它。 如果返回值被忽略,它将是无害的。
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
值,其余的参数将作为常规parameter passing。
因为返回的函数被封装在另一个函数中,所以在初始调用和间隔调用之间会有相同的行为。