有没有办法将setInterval
javascript的方法配置为立即执行方法然后用定时器执行
第一次不延迟执行setInterval函数
第一次直接调用函数是最简单的:
foo();
setInterval(foo, delay);
然而,有充分的理由可以避免setInterval
- 特别是在某些情况下,一整套setInterval
事件可以在没有任何延迟的情况下立即到达。另一个原因是,如果您想停止循环,您必须显式调用clearInterval
,这意味着您必须记住从原始setInterval
调用返回的句柄。
因此,另一种方法是foo
使用setTimeout
代替为后续调用触发自身:
function foo() {
// do stuff
// ...
// and schedule a repeat
setTimeout(foo, delay);
}
// start the cycle
foo();
这保证了调用之间至少有一个间隔delay
。如果需要,它还可以更轻松地取消循环 - 您只是setTimeout
在达到循环终止条件时不调用。
更好的是,您可以将所有这些都包装在一个立即调用的函数表达式中,该函数表达式创建该函数,然后如上所述再次调用自身,并自动启动循环:
(function foo() {
...
setTimeout(foo, delay);
})();
它定义了函数并一口气开始循环。
我不确定我是否正确理解您,但您可以轻松地执行以下操作:
setInterval(function hello() {
console.log('world');
return hello;
}(), 5000);
显然有很多方法可以做到这一点,但这是我能想到的最简洁的方法。
由于同样的问题,我偶然发现了这个问题,但是如果您需要表现得完全一样,setInterval()
但唯一的区别是在开始时立即调用该函数,这些答案都没有帮助。
这是我对这个问题的解决方案:
function setIntervalImmediately(func, interval) {
func();
return setInterval(func, interval);
}
该解决方案的优点:
- 使用的现有代码
setInterval
可以很容易地通过替换进行调整 - 在严格模式下工作
- 它适用于现有的命名函数和闭包
- 您仍然可以使用返回值并将其传递给
clearInterval()
以后
例子:
// create 1 second interval with immediate execution
var myInterval = setIntervalImmediately( _ => {
console.log('hello');
}, 1000);
// clear interval after 4.5 seconds
setTimeout( _ => {
clearInterval(myInterval);
}, 4500);
厚颜无耻,如果你真的需要使用,setInterval
那么你也可以替换原来的setInterval
. 因此,在现有代码之前添加此代码时无需更改代码:
var setIntervalOrig = setInterval;
setInterval = function(func, interval) {
func();
return setIntervalOrig(func, interval);
}
尽管如此,上面列出的所有优点在这里都适用,但不需要替代。
您可以包装setInterval()
在提供该行为的函数中:
function instantGratification( fn, delay ) {
fn();
setInterval( fn, delay );
}
...然后像这样使用它:
instantGratification( function() {
console.log( 'invoked' );
}, 3000);
这是一个包装器,可以在您需要时对其进行漂亮的处理:
(function() {
var originalSetInterval = window.setInterval;
window.setInterval = function(fn, delay, runImmediately) {
if(runImmediately) fn();
return originalSetInterval(fn, delay);
};
})();
将 setInterval 的第三个参数设置为 true,它将在调用 setInterval 后立即运行第一次:
setInterval(function() { console.log("hello world"); }, 5000, true);
或者省略第三个参数,它将保留其原始行为:
setInterval(function() { console.log("hello world"); }, 5000);
一些浏览器支持setInterval 的附加参数,这个包装器没有考虑到这些参数;我认为这些很少使用,但如果您确实需要它们,请记住这一点。