Javascript 插入';暂停';在a.每个枚举中

Javascript 插入';暂停';在a.每个枚举中,javascript,jquery,Javascript,Jquery,使用jQuery“.each()”对一组元素的每个枚举插入“暂停”的最佳/推荐方式是什么 setTimeout(yourFunction(),5000)可能是您想要的东西。但请记住,此函数将在5s后执行yourFunction()。如果setTimeout之后有代码,那么它仍然会立即执行,所以这取决于您想做什么。如果您真的想停止所有代码的执行,那么这是一个很难解决的问题。您可以在文档中查看一些建议的解决方案/功能。但是对于JavaScript来说,不完全锁定CPU就很难完全停止执行。< P> >

使用jQuery“.each()”对一组元素的每个枚举插入“暂停”的最佳/推荐方式是什么


setTimeout(yourFunction(),5000)可能是您想要的东西。但请记住,此函数将在5s后执行
yourFunction()
。如果setTimeout之后有代码,那么它仍然会立即执行,所以这取决于您想做什么。如果您真的想停止所有代码的执行,那么这是一个很难解决的问题。您可以在文档中查看一些建议的解决方案/功能。但是对于JavaScript来说,不完全锁定CPU就很难完全停止执行。

< P> >在JavaScript函数的中间没有延迟这样的延迟。 为了在下一次工作增量之前合法地延迟5秒,您需要获取作业所需的数据,将工作分成小块,设置5秒计时器,并在每个计时器滴答声中执行一块工作

下面是一个这样做的工作示例:

var objList=$('.someClass');
var-cntr=0;
var时间延迟=5000;
函数doNextIteration(){
$(objList[cntr++].html(cntr);//此处的代码:这是我在演示中显示的进度
如果(cntr<对象列表长度){
setTimeout(doNextIteration,timeDelay);
}
}
如果(objList.length>0){
doNextIteration();
}

如果您有类似的
html

<div class="someClass">google</div>
<div class="someClass">facebook</div>
<div class="someClass">ARPANET</div>
这是小提琴

您可以设置自己选择的时间

或者根据您编辑的问题,这可能会有所帮助


如果出于某种原因必须使用
。每个
,那么这将使您非常接近,前提是您在每个迭代中没有做大量工作:

var i = 0;
$( '.someClass' ).each( function() {
    setTimeout((function (el) {
        // do something with 'el'
    })(this), i * 5000);
    i += 1;
});
但这样做(考虑到你问题的措辞)更为正确:

(function() {
    var arr = $('.someclass'),
        i = 0,
        fn = function() {
            var el = arr[i];

            // do something with 'el'

            i += 1;
            if (i < arr.length) {
                setTimeout(fn, 5000);
            }
        };
    fn();
})();
(函数(){
var arr=$('.someclass'),
i=0,
fn=函数(){
var el=arr[i];
//用“el”做点什么
i+=1;
如果(i
从技术上讲,您不能像在代码中建模那样这样做,因为JavaScript是单线程的,通常在浏览器(或选项卡)UI线程上运行——任何睡眠/延迟都会阻止浏览器重新绘制页面,也会阻止用户与页面交互

您需要安排浏览器定期调用代码。像这样的东西可以达到目的:

var objects = $.makeArray($( '.someClass' ));

var callback;

callback = function() {
    var item = objects.shift();

    // Do something with item.

    if (objects.length != 0) {
        setTimeout(callback, 5000);
    }
}

setTimeout(callback, 5000);

此解决方案假定您希望从最后一个项目完成处理的时间起5秒钟内处理每个项目。这意味着:

  • 如果在处理每个项目时执行了
    confirm()
    或其他操作,则下一个项目将在用户关闭对话框后的5秒钟内被处理
  • 总执行时间为(5000N+T),其中N是初始列表中的项目数,T是处理每个项目所需的总时间

  • 您可以使用以下函数来封装此功能:

    jQuery.eachWithDelay = function(sequence, delay, callback) {
        var objects = jQuery.makeArray(sequence);
    
        if (objects.length == 0) {
            return;
        }
    
        var f;
    
        f = function() {
            var item = objects.shift();
    
            if (callback(item) && objects.length != 0) {
                setTimeout(f, delay);
            }
        };
    
        setTimeout(f, delay);
    };
    
    被称为:

    $.eachWithDelay($('.someClass'), 5000, function(item) {
        // Do something with item
    
        return true; // Return true to continue iterating, or false to stop.
    });
    

    请看。

    因为我们只是在四处寻找答案;这是我的。每个都没有

    函数doTheDo(els){

    }

    doTheDo($('#errors li').toArray()


    如果你给我们一些你正在做的事情的背景,这将更容易回答,因为解决方案将根据具体情况而有所不同。这是一种非常糟糕的做法。它会锁定浏览器(UI完全没有响应)并在整个时间内使CPU最大化。一些浏览器甚至可能会报告网页已挂起,以保护查看者免受错误的javascript代码的影响。javascript中的一个注释-
    Array.shift()
    可能比手动遍历数组慢得多。这是因为javascript数组不是“真”数组——它们是以字符串作为键的对象。这意味着当您关闭第一个元素时,JS引擎必须移动数组中的每个项目,例如
    arr[“0”]=arr[“1”];arr[“1”]=arr[“2”]。。。等等。
    @digitalbath:注意。当然,过早优化是万恶之源;如果在这种情况下需要这种优化,那么它可以非常容易地实现。我倾向于首先考虑可读性,这就是为什么我选择了
    shift
    。但是读者应该了解性能影响,所以+1对您来说是完全同意的-我想我会提到它。如果我理解jQuery.delay函数,它会将内容放入队列中,并且只适用于使用该队列的特定类型的操作。由于OP没有说明他们在循环中真正想做什么,我们不知道这是否真的有效。你可以通过将.shift()替换为.pop()来倒退该死的,我无法回复@digitalbath,所以我在这里就这么做。你错了,至少在Chrome中,pop比for()快16倍,几乎比each()快66倍:证明:
    var objects = $.makeArray($( '.someClass' ));
    
    var callback;
    
    callback = function() {
        var item = objects.shift();
    
        // Do something with item.
    
        if (objects.length != 0) {
            setTimeout(callback, 5000);
        }
    }
    
    setTimeout(callback, 5000);
    
    jQuery.eachWithDelay = function(sequence, delay, callback) {
        var objects = jQuery.makeArray(sequence);
    
        if (objects.length == 0) {
            return;
        }
    
        var f;
    
        f = function() {
            var item = objects.shift();
    
            if (callback(item) && objects.length != 0) {
                setTimeout(f, delay);
            }
        };
    
        setTimeout(f, delay);
    };
    
    $.eachWithDelay($('.someClass'), 5000, function(item) {
        // Do something with item
    
        return true; // Return true to continue iterating, or false to stop.
    });
    
     if(els.length == 0) return;
    
     $(els.shift()).click();
     setTimeout(doTheDo, 5000, els);