-
跃然一笑
最简单的方法是自己第一次直接调用函数:foo();setInterval(foo, delay);然而,我们有充分的理由避免setInterval-特别是在某些情况下setInterval事件可以在没有任何延迟的情况下立即到达。另一个原因是,如果要停止循环,则必须显式调用clearInterval这意味着您必须记住从原始句柄返回的句柄。setInterval打电话。所以另一种方法是foo为后续调用触发自身setTimeout相反:function foo() {
// do stuff
// ...
// and schedule a repeat
setTimeout(foo, delay);}// start the cyclefoo();这保证了至少间隔期delay在通话之间。如果需要的话,还可以更容易地取消循环-只是不调用setTimeout当达到循环终止条件时。更好的是,您可以将所有这些都封装在立即调用函数表达式它创建函数,然后按照上面的方式再次调用自己,并自动启动循环:(function foo() {
...
setTimeout(foo, delay);})();它定义了函数,并在一次执行中启动了循环。
-
catspeake
我不确定我是否正确地理解了你,但是你可以很容易地做这样的事情:setInterval(function hello() {
console.log('world');
return hello;}(), 5000);显然有很多种方法,但这是我能想到的最简洁的方法。
-
慕桂英3389331
由于同样的问题,我偶然发现了这个问题,但是如果你需要的话,所有的答案都帮不上忙。行为端正喜欢setInterval()但是随着只函数在开头立即调用的差异。以下是我对这个问题的解决方案:function setIntervalImmediately(func, interval) {
func();
return setInterval(func, interval);}这一解决方案的优点是:现有代码使用setInterval可以很容易地通过替换来适应严格模式它使用现有的命名函数和闭包。仍然可以使用返回值并将其传递给clearInterval()后来例子:// create 1 second interval with immediate executionvar myInterval = setIntervalImmediately( _ => {
console.log('hello');
}, 1000);// clear interval after 4.5 secondssetTimeout( _ => {
clearInterval(myInterval);
}, 4500);如果你真的需要用setInterval然后您也可以替换原来的setInterval..因此,在现有代码之前添加此代码时不需要更改代码:var setIntervalOrig = setInterval;setInterval = function(func, interval) {
func();
return setIntervalOrig(func, interval);}尽管如此,上面列出的所有优点都适用于此,但不需要替换。