定义jQuery.each()循环步骤之间的超时

时间:2014-05-22 07:10:35

标签: jquery delay synchronous each delayed-execution

据我所知,$.each()是一个同步函数,所以我认为,不管怎么说,必须通过某种技术来延迟循环遍历数组的步骤。

我还没找到合适的方法。我怎么能正确设置它的步骤超时?

更新:

问题,为什么我需要这个,是循环中的步骤数和计算是巨大的,并且它们使异步函数太慢。我想为它们节省一些处理器速度,并通过这种延迟来定义“优先级”。我正在使用非回调函数,主要是循环步骤中的jQuery.css()。

重要:

我正在寻找一种技术来设置延迟IN BETWEEN步骤,减少计算量,不用循环设置大量的超时,将按时间运行。

3 个答案:

答案 0 :(得分:7)

我建议不要使用.each(),而是手动循环收集。

HTML

<div class="foo">A</div>
<div class="foo">B</div>
<div class="foo">C</div>
<div class="foo">D</div>
<div class="foo">E</div>

的Javascript

var collection = $('.foo');
if( collection.length > 0 ){
    var i = 0;
    var fn = function(){
        var element = $(collection[i]);
        console.log(i + ' (' + element.text() + ') : %o', element);
        // Do whatever
        if( ++i < collection.length ){
            setTimeout(fn, 5000);
        }
    };
    fn();
}

如果您愿意,可以相当容易地包含在$('.foo').delayedEach(5000, function(){})扩展名中。

Working fiddle

答案 1 :(得分:2)

根据您的情况,这样的事情可以起作用:

$('.some-results').each(function(i) {
  $(this).delay(500 * i).someAction();
});

在此示例中,您使用数组的索引号(i)使每次迭代比最后一次延迟500ms。希望这会有所帮助。

注意:如果不清楚,someAction()可以是您计划对元素执行的任何操作。可以是动画,获取值等等。

答案 2 :(得分:1)

试用此代码:

<强> HTML

<div class="result"></div>
<div class="result"></div>
<div class="result"></div>

<强>的Javascript

$('.result').each(function(i) {
  setTimeout(function(){ alert(i);},5000*i);
});

工作JSFiddle