时间延迟不适用于JavaScript代码

时间:2013-07-02 05:52:56

标签: javascript timedelay

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

这会在2秒后一次打印0 1 2 3 4 5.为什么会这样?什么是解决方案 在2秒后打印每个数字。

6 个答案:

答案 0 :(得分:1)

你的超时需要间隔,我总是使用不同的var来保存每个,所以我可以在特定的一个上清除时间

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 :(得分:1)

尝试使用此代码。

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

答案 2 :(得分:1)

您正在触发5个异步,几乎同时调用该函数。

答案 3 :(得分:1)

setTimeout 不会阻止代码执行 2秒钟。实际上setTimeout立即返回,循环继续。因此,在超时后几乎同时触发了所有5个异步调用。

要接近你想要的东西,我会喜欢这种类似递归的版本

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

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

print(0);

答案 4 :(得分: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/

答案 5 :(得分:0)

setTimeout(fn,delay)在ms后延迟fn后运行给定函数delay。因此,您可以简单地将i乘以2000并使用:

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

如果要在i中报告或使用fn,则应创建一个函数,该函数返回一个函数以供setTimeout使用,使用闭包来报告或使用{{1} }}。在下面的i中使用变量i包含,由立即调用的匿名函数使用,创建x函数对象以供f中的后续使用:

setTimeout

jsFiddle