这是一个例子:
function func1()
{
setTimeout(function(){doSomething();}, 3000);
}
for(i=0;i<10;i++)
{
func1();
}
执行后,延迟只发生在第一个循环中,但它并没有发生在其余的循环中,因为&#39;表达。
我希望延迟发生在所有循环中,而不仅仅是在第一次。
我的代码有什么问题?
答案 0 :(得分:7)
您正在安排10个电话,但问题是所有人都在同一时间安排,即3秒后。
如果你想逐步调用它们,那么你需要增加每次通话的延迟。
解决方案是将延迟单位值传递给func1
function func1(i) {
setTimeout(function() {
doSomething();
}, i * 500);//reduced delay for testing
}
for (i = 0; i < 10; i++) {
func1(i + 1);
}
var counter = 0;
function doSomething() {
snippet.log('called: ' + ++counter)
}
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<!-- To show result in the dom instead of console, only to be used in the snippet not in production -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
答案 1 :(得分:4)
循环将安排10次超时全部在3秒后完成。您可以使用setTimeout
:
function loopAsync(delay, n, f) {
setTimeout(function() {
if (n > 0) {
f()
loopAsync(delay, n - 1, f)
}
}, delay)
}
loopAsync(3000, 10, doSomething)
答案 2 :(得分:2)
什么是你正在调用10次(没有延迟)func1()
然后你所拥有的是10个函数同时,解决方案很简单,使用setInterval,这里是{{3} }
答案 3 :(得分:1)
使用async.js:
async.timesSeries(5, function (n, next) {
setTimeout(function(){
doSomething();
next();
}, 3000);
});
答案 4 :(得分:1)
如果你想要不断延迟迭代,恕我直言,你最好使用setInterval:
var loops = 9,
intervalId = setInterval(function () {
// My super code goes here
console.log(loops);
loops-- <= 0 && (clearInterval(intervalId));
}, 3000);
我为你做了jsfiddle。
答案 5 :(得分:0)
for循环连续运行,因此每次调用都是该调用的3000毫秒。导致两次通话之间没有延迟。 为了更好地理解,在时间t和t + 1循环调用func1。因此它将在t + 3000和T + 3001执行,没有任何区别。
您可以尝试以下方法: -
function func1(i){
setTimeout(function(){doSomething();}, i * 3000);
}
for(i=i;i<=10;i++){
func1(i);
}
注意: - 使用i = 1初始化循环。
答案 6 :(得分:0)
这是因为setTimeout()
功能是非阻塞的。因此,setTimeout()
功能仅在第一次运行。
试试这段代码......
var i = 1;
function func1(){
setTimeout(function(){
doSomething();
i++;
if(i < 10){
func1();
}
}, 3000);
}
func1();