使用setTimeout延迟$ .each()函数

时间:2014-05-20 09:41:06

标签: javascript jquery each timing

美好的一天。

我有这个简单的代码:

totalTextArray = textForChatWithSeparators.split("#");    
    $.each(totalTextArray, function( index, value ) {           
    setTimeout(function(){console.log( value )},1000);
});

我希望在控制台日志中看到每一秒都记录“value”,但是在1秒的延迟之后,我看到所有日志都在一个块中出现。

我做错了什么?我在想这个函数内部的函数可能会导致一些缓冲问题吗?

2 个答案:

答案 0 :(得分:4)

你正在做的是

  • 拨打setTimeout n
  • 所有超时将在1000 ms一起
  • 后触发

如果您不想更改结构,则需要做的是增加每次迭代的超时值,例如

setTimeout(function(){ console.log( value ) },1000*index);

一个可能更优雅(也更正确的方式imo),就是一起改变循环的结构。使用像

这样的间隔计时器
(function _loop( elem ) {
     console.log( elem );        

     if( totalTextArray.length ) {
         setTimeout( _loop.bind( null, totalTextArray.shift() ), 1000 );
     }
}());

答案 1 :(得分:1)

您需要的只是closure

totalTextArray = textForChatWithSeparators.split("#");

$.each(totalTextArray, function(value, index) {
    setTimeout(function() {
        console.log(value);
    }, 1000 * (index + 1));
});

编辑: 我添加了有关closure的更多链接: