2013-07-02 3 views
1
for(;i<5;i++) 
{ 
(function(z){ 
    setTimeout(function(){console.log(z);},2000);})(i); 
} 

Отпечаток 0 1 2 3 4 5 на один выстрел после 2 секунд. Почему это так? и каково решение для печати каждого номера через 2 сек.Задержка времени не работает в javascript-коде

+2

Приращение задержка? '2000 * i' – elclanrs

+0

Таймеры все стреляют * в то же время * - помните, что setTimeout * немедленно возвращается * (он не блокируется), и поэтому все setTimeouts * созданы одновременно * и все они настроены на огонь с тем же интервалом (2000 мс) в будущем с момента их создания. – user2246674

+0

ОК, если я поставил 2000 * i.It работает. Но если я ставлю 2000 + i, это будет отображаться на одном снимке. Почему так? –

ответ

1

Ваши таймауты должны быть разнесены, и я всегда использую различные вар, чтобы сохранить каждый из них в так что я могу clearTimeout на определенном один

Live Demo

var tIds=[]; 
for(var i=0;i<5;i++) { 
(function(z){ 
    tIds[i]=setTimeout(function(){window.console&&console.log(z);},2000*i); //fire 2000,4000,6000 
    })(i); 
} 

Также, пожалуйста read the documentation понять, почему 2000+ я не буду работать

1

Попробуйте использовать этот код.

//Referring your code for better understanding.. 
    for(i=0;i<5;i++) { 
    (function(z){ 
     setTimeout(function(){console.log(z);},2000*z);})(i); 
    } 
+1

На самом деле он печатает «1 2 3 4 5», а не «0 1 2 3 4». Остерегайтесь приращения plz. – neuront

+0

@neuront: Спасибо, что уведомил мою ошибку. Я обновил это. :) –

1

Вы обстреливают 5 асинхронный, почти одновременно, инвокации функции.

0

вы могли бы попробовать дифф подход с использованием setInterval,

var timer = setInterval(function(){printThing();},2000); 

var i = 0;  
function printThing(){ 
    if(i<=5){ 
    window.console && console.log(i); 
    ++i; 
    } 
    else{ 
    clearInterval(timer) 
    } 
}//end function 

Вот пример http://jsfiddle.net/W9vS4/2/

+0

Alert будет блокировать – mplungjan

1

setTimeoutне будет блокировать выполнение вашего кода в течение 2 секунд. Фактически setTimeout немедленно возвращается, и цикл продолжается. Таким образом, все 5 ваших асинхронных вызовов запускались почти одновременно с таймаутом.

Подойти, что вы хотите, я хотел бы эта рекурсия как версия

 
function print(i) { 
    if (i >= 5) return; 

    console.log(i); 
    setTimeout(function() { 
     print(i + 1); 
    }, 2000); 
} 

print(0); 
0

setTimeout(fn,delay) запускает данную функцию fn после задержки delay в мс. Таким образом, вы можете просто умножить i к 2000 году и использования:

for(;i<5;i++) { 
    setTimeout(function(){console.log(z);},2000*i); 
} 

Если вы хотите сообщить или использовать i в fn, вы должны создать функцию, которая возвращает функцию для использования в setTimeout, используя замыкание, чтобы сообщить или использование i. В следующем i заключен с использованием переменной x, используемый немедленно вызывается анонимной функции, создающей объект функции f для последующего использования в setTimeout:

for(var i=0;i<5;i++) 
{ 
    var f = function(x){ 
     return function(){console.log(z+'#'+x);} 
    }(i); 
    setTimeout(f,2000*i); 
} 

jsFiddle

+0

Но используя 2000 *, я увеличиваю задержку на 1 секунду каждый раз. Так что можно сделать, чтобы печатать числа с равным интервалом время? –

+0

Нет, он будет увеличиваться на 2 секунды (2000 мс) каждый раз. См. Отрегулированный jsfiddle. – KooiInc