如何在setInterval循环中设置延迟?

时间:2013-05-03 07:26:03

标签: javascript jquery

以下是我的代码的一部分:

$('#monitor').click(function(){
            setInterval(function(){
                    $('#status_table tr [id^="monitor_"]:checked').each(function () {
                        monitoring($(this).parents('tr'));
                     });
                },15000);
        });

我想为选中复选框的表中的每一行调用函数monitoring。如果我只有一个,它工作正常。但是当我有多个时,它会混乱,这意味着它不会在表格中附加正确的状态。 这是我的函数monitoring

       function monitoring($row) {
            fbType = $row.find('td:nth-child(3)').html();
            fbNum = $row.find('td:nth-child(4)').html();
            eachStatus =$row.find('td:nth-child(5)').attr('id');
            $('#ptest').append(fbType + ' '+ fbNum+' '+ eachStatus +'<br>');

            $.post('/request', {inputText: fbNum,key_pressed: fbType.toString()}).done(function (reply) {
                if (reply == "on") {
                    $('#status_table tr #'+eachStatus).empty().append("on");

                } else if (reply =="off") {
                    $('#status_table tr #'+eachStatus).empty().append("off");

                }
            });
        }

如何延迟每行的函数调用?我尝试了以下

       $('#monitor').click(function(){
            setInterval(function(){
                    $('#status_table tr [id^="monitor_"]:checked').each(function () {
                       setTimeout(function(){
                            monitoring($(this).parents('tr'));
                       });
                     },1000);
                },15000);
        });

但div #ptest显示undefined

3 个答案:

答案 0 :(得分:2)

替换以下行:

monitoring($(this).parents('tr'));

这个:

monitoring($(this).parent('tr'));

答案 1 :(得分:1)

你只是将他们推迟在一起,这就是为什么他们仍然在一起。你想要的是将他们彼此延迟

$('#monitor').click(function(){

  //a jQuery object is like an array
  var checked = $('#status_table tr [id^="monitor_"]:checked');

  (function loop(i){

    //monitor element at index i
    monitoring($(checked[i]).parent('tr'));

    //delay
    setTimeout(function(){
      //when incremented i is less than the number of rows, call loop for next index
      if(++i<checked.length) loop(i);
    },15000);

  }(0)); //start with 0

});

答案 2 :(得分:0)

试试这个:

setTimeout(function(){
    monitoring($(this).closest('tr'));
},1000);