JavaScript:如何让 setInterval() 现在开始?

IT技术 javascript
2021-02-17 20:26:54

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

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

有没有办法在没有这个重复代码的情况下实现这一目标?

3个回答

你的方法是正常的做法。

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

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();
plus:setTimeout更可取,因为如果出现错误它不会继续重复。
2021-04-20 20:26:54
...尽管您当前的答案失去了一点功能。OP 的返回结果是setInterval赋值给一个变量,这可能意味着应该在某个时候取消间隔。要复制该行为,您需要setTimeout根据可以设置为停止调用的标志的状态进行递归调用。
2021-04-26 20:26:54
当然,麻烦的是再次重新启动它。您可能需要将整个事情放在一个可以从外部调用的函数中,或者只是在封闭的变量环境中按名称公开该函数,以便您可以再次启动它。
2021-04-28 20:26:54
是的,如果需要稍后召回和/或清除超时,那么最好的解决方案可能在我上面的编辑中找到
2021-05-02 20:26:54
+1 如果没有其他需要从外部调用该函数,我认为这是一个很好的解决方案。
2021-05-07 20:26:54

如果您的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您正在调用的函数值,其余参数将作为常规参数传递。

由于返回的函数包含在另一个函数中,因此初始调用和间隔调用之间的行为相同。