在jquery中针对特定时间间隔停止每次迭代执行.each执行?

时间:2012-09-12 20:30:32

标签: javascript jquery time each intervals

我正在尝试在我的javascript中创建以下功能:

$("mySelector").each(function(){

// Do something (e.g. change div class attribute)   
// call to MyFunction(), the iteration will stop here as long as it will take for myFunction to complete

});

function myFunction() 
{   
 // Do something for e.g. 5 seconds 
}

我的问题是如何在myFunction()的持续时间内停止每次迭代?

3 个答案:

答案 0 :(得分:3)

不,那是不可能的。您必须以不同的方式对其进行编码,可能使用基于.each的当前索引的setTimeout。

$("mySelector").each(function(i){

    // Do something (e.g. change div class attribute)   
    // call to MyFunction(), the iteration will stop here as long as it will take for myFunction to complete
    setTimeout(myFunction,i*5000);

});

function myFunction() 
{   
 // Do something for e.g. 5 seconds 
}

编辑:你也可以排队:http://jsfiddle.net/9Bm9p/6/

$(document).ready(function () {
    var divs = $(".test");
    var queue = $("<div />");

    divs.each(function(){
        var _this = this;
        queue.queue(function(next) {
            myFunction.call(_this,next); 
        });
    });
});

function myFunction(next) {    
    // do stuff
    $(this).doSomething(); 

    // simulate asynchronous event
    var self = this;
    setTimeout(function(){
        console.log(self.id);
        // go to next item in the queue
        next();
    },2000);

}

答案 1 :(得分:2)

这是一个我认为会做你需要的jsFiddle:

http://jsfiddle.net/9Bm9p/2/

您只需要将选择器替换为您使用的选项。

正在发生的“循环”将等待myFunction完成,然后再转到下一个元素。我在myFunction内添加了setTimeout来模拟它需要一段时间。如果您正在使用异步事物(例如AJAX请求),则需要将调用放在myFunction方法内的complete ...或动画的回调中。

但正如有人已经评论过,如果myFunction中的所有内容都是同步的,那么您应该可以按原样使用它。如果您希望此过程是异步的,或者myFunction中的内容是异步的,则不能使用for循环或.each()。

答案 2 :(得分:1)

(function () {
    "use strict";

    var step = 0;
    var content = $("mySelector");
    var max = content.length;
    var speed = 5000; // ms


    var handle = setInterval(function () {
        step++;
        if (step >= max) {
            clearInterval(handle);
        } else {
            var item = content[step];
            // do something
        }
    }, speed);
}());

setInterval将每隔n毫秒执行一次,clearInterval将在您完成后停止它。这不会锁定浏览器(假设您的“做某事”也没有)。 FRAGILE:它假定$("mySelector")的结果在任务期间有效。如果情况不是这样,那么在do something内,然后再次验证item