将嵌套的setTimeout函数更改为高效循环

时间:2013-10-14 13:02:25

标签: javascript jquery

我有一份学生名单 - 每名学生都是具有特定班级和身份证的DIV。

我还有一系列学生证,我随机分配。

我想做的是以下内容:

  1. 选择一名随机学生
  2. 突出显示紫色的相关DIV(pulse类)
  3. 暂停(如0.2s)
  4. 选择另一名随机学生
  5. 冲洗并重复1-3次,共计10次
  6. 以不同颜色(selected类)
  7. 突出显示所选学生

    以下代码正常运作......

                    setTimeout(function() {
                        $("#" + arr[1]).addClass('pulse');
                        setTimeout(function() {
                            $("#" + arr[1]).removeClass('pulse');
    
                            setTimeout(function() {
                                $("#" + arr[2]).addClass('pulse');
                                setTimeout(function() {
                                    $("#" + arr[2]).removeClass('pulse');
    
                                        setTimeout(function() {
                                            $("#" + arr[3]).addClass('pulse');
                                            setTimeout(function() {
                                                $("#" + arr[3]).removeClass('pulse');
    
                                                setTimeout(function() {
                                                    $("#" + arr[4]).addClass('pulse');
                                                    setTimeout(function() {
                                                        $("#" + arr[4]).removeClass('pulse');
    
                                                        setTimeout(function() {
                                                            $("#" + arr[5]).addClass('pulse');
                                                            setTimeout(function() {
                                                                $("#" + arr[5]).removeClass('pulse');
    
                                                                setTimeout(function() {
                                                                    $("#" + arr[6]).addClass('pulse');
                                                                    setTimeout(function() {
                                                                        $("#" + arr[6]).removeClass('pulse');
    
                                                                        setTimeout(function() {
                                                                            $("#" + arr[7]).addClass('pulse');
                                                                            setTimeout(function() {
                                                                                $("#" + arr[7]).removeClass('pulse');
    
                                                                                setTimeout(function() {
                                                                                    $("#" + arr[8]).addClass('pulse');
                                                                                    setTimeout(function() {
                                                                                        $("#" + arr[8]).removeClass('pulse');
    
                                                                                        setTimeout(function() {
                                                                                            $("#" + arr[9]).addClass('pulse');
                                                                                            setTimeout(function() {
                                                                                                $("#" + arr[9]).removeClass('pulse');
    
                                                                                                setTimeout(function() {
                                                                                                    $("#" + arr[10]).addClass('pulse');
                                                                                                    setTimeout(function() {
                                                                                                        $("#" + arr[10]).removeClass('pulse');
                                                                                                        $("#" + arr[0]).addClass('activeClass');
                                                                                                        Dojo.disableButtons(false);
                                                                                                    }, 250);
                                                                                                }, 250);
    
                                                                                            }, 250);
                                                                                        }, 250);
    
                                                                                    }, 250);
                                                                                }, 250);
    
                                                                            }, 250);
                                                                        }, 250);
    
                                                                    }, 250);
                                                                }, 250);
    
                                                            }, 250);
                                                        }, 250);
    
                                                    }, 250);
                                                }, 250);
    
                                            }, 250);
                                        }, 250);
    
                                }, 250);
                            }, 250);
    
                        }, 250);
                    }, 250);
    

    但是非常难看。

    使用for循环是否有更有效的方法?

    提前致谢,

3 个答案:

答案 0 :(得分:5)

你可以使用一个函数(显然重命名它更有意义):

function lessMessy(index) {
    $("#" + arr[index]).addClass('pulse');
    if (index === 10) {
        $("#" + arr[0]).addClass('activeClass');
        Dojo.disableButtons(false);
    } else {
        setTimeout(function() {
            $("#" + arr[index]).removeClass('pulse');
            lessMessy(index + 1)
        }, 250)
    }
}

lessMessy(1)

编辑:请注意,这比setInterval好,因为总是等待四分之一秒。如果内部代码花费的时间超过1/4秒,则setInterval将跳过该迭代。这将导致页面损坏,因为pulse类不会从前一个元素中删除。

答案 1 :(得分:1)

我认为setInterval功能是您所需要的 这会执行其他功能,直到您拨打clearInterval [编辑]
这是一个想法:

var arr = YOUR ARRAY HERE;
var index = 0;
var t = setInterval(function(){
    if (index > 0){
       $('#' + arr[index - 1]).removeClass('pulse'); //remove class from previous
    }
    if (index < 10){
       $('#' + arr[index]).addClass('pulse'); //add class to current element
    }
    else { 
      clearInterval(t);//stop everything
    }
    index ++;
}, 250)

这可能不起作用。这是我的头脑,但它应该给你和想法。

答案 2 :(得分:0)

使用回调的稍微冗长/一般的方法:

var pulseStudent = function( student, callback ){
  student = $('#' + student);
  student.addClass('pulse');
  setTimeout(function(){student.removeClass('pulse');}, 250);
  setTimeout(callback, 500);
};

var pulseStudents = function( students, callback ){
  var student = students.pop();
  if ( student ) {
    pulseStudent( student, function(){
      pulseStudents( students, callback );
    });
  }
  else {
    callback();
  }
};

pulseStudents( arr.slice(0), function(){
  $("#" + arr[0]).addClass('activeClass');
  Dojo.disableButtons(false);
});