如何立即开始 setInterval 循环?

新手上路,请多包涵

在一个简单的 setInterval

 setInterval(function() {
      // Do something every 9 seconds
}, 9000);

第一个动作将在 9 秒后发生 ( t=9s )。如何强制循环立即执行第一个操作( t=0 )?

我认为这是由于 setInterval 的机制导致 Delay - Action - Delay - Action ... 循环;而不是 Action - Delay - Action - Delay ... 循环。

编辑: 我的功能确实是一个循环

setInterval(function(){
$('.test').each(function(idx){
    var duration = 1000;
    $(this).delay(duration*idx);
    Some stuff here
});
}, 4000);

原文由 Googlebot 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 681
2 个回答

把事情简单化。您可以使用命名函数代替匿名函数;调用它并为其设置一个时间间隔。

 function doSomething() {
    console.log("tick");
}
doSomething();
setInterval(doSomething, 9000);

如有必要,创建范围:

 (function() {
    function doSomething() {
        console.log("tick");
    }
    doSomething();
    setInterval(doSomething, 9000);
})();

最后,以下工作不会创建或影响 x

 setInterval(function x() {
    console.log("tick");
    return x;
}(), 9000);

原文由 Salman A 发布,翻译遵循 CC BY-SA 3.0 许可协议

有时我使用这种模式…

 (function me() {
    // Do something every 9 seconds

    setTimeout(me, 9000);
})();

它并不完全相同,因为它会等到执行 do something 后再等待约 9 秒再次调用它。但是,这通常很有用,因此事件队列中的事件不会不必要地堆积起来(但不太可能某些代码需要 9 秒才能运行 :)

请注意,在较旧的 IE 中, me 将泄漏到外部范围。

原文由 alex 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题