javascript - 在继续循环之前让 SetTimeout 完成

标签 javascript jquery loops settimeout

我正在尝试使用 Javascript/jquery 让一排字母逐个点亮。我使用 span 元素创建了一个数组,并循环遍历每个字母,首先将其颜色更改为红色,然后再次更改为黑色。问题是 $.each 循环函数不会等待 setTimeout 完成...它会立即循环所有这些函数,使它们立即全部变成红色,而不是一一变成红色。任何想法如何解决这一问题?这是我的代码:

JSFiddle:http://jsfiddle.net/john23/8chu18k9/

var array = $(".one");

var doIt = function () {
    $.each(array, function(index, value){
            array.eq(index).css('color','red');
        setTimeout(function(){
            array.eq(index).css('color','black');                                
        }, 500);
    });

};

doIt();
P {
    color:black;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p>
    <span class="one">H</span><span class="one">e</span><span class="one"></span><span class="one">l</span><span class="one">l</span><span class="one"></span><span class="one">o</span><span class="one"> M</span><span class="one"></span><span class="one">y </span><span class="one">N</span><span class="one"></span><span class="one">a</span>
</p>

最佳答案

setTimeout 是异步的。它将立即将控制权返回给调用上下文,因此此代码将无法按预期工作。我建议使用 setInterval 来代替,它以给定的时间间隔重复运行相同的函数:

var array = $('.one');
var currentIndex = 0;
var intervalId = setInterval(function(){
  array[currentIndex].css('color','black');
  currentIndex++;
  // We've reached the end of the array, stop calling this function
  if (currentIndex == array.length) clearInterval(intervalId);
}, 500);

澄清一点:setInterval 将返回一个 ID。然后,您可以将该 ID 传递给函数 clearInterval 以停止该函数的调用。

关于javascript - 在继续循环之前让 SetTimeout 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28155376/

相关文章:

javascript - jquery 触发器 ('click' ) 只工作一次

c - 最后一次性输出结果与使用for循环时逐一输出结果如何?

javascript - 如何使用 iframe 而不是 ajax 重新加载网页的一部分?

jquery - 如果查询与数据不同,则关闭 jquery 自动完成

javascript - Chrome 失败的图像背景卡住问题

javascript - 以不同的时间间隔运行多个函数

javascript 对象键值循环 setInterval

javascript - 自定义应用程序启动屏幕

javascript - 如何创建自动化应用程序导览/演练?

javascript - 模式关闭后视频继续播放 Firefox