Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery函数使用包含setTimeout的each循环调用自身时,会立即发生,而不是在结束时_Javascript_Jquery - Fatal编程技术网

Javascript jQuery函数使用包含setTimeout的each循环调用自身时,会立即发生,而不是在结束时

Javascript jQuery函数使用包含setTimeout的each循环调用自身时,会立即发生,而不是在结束时,javascript,jquery,Javascript,Jquery,我正在做一个项目,需要在一个表格中在线滚动用户列表。其思想是服务器对整个列表执行ping操作,它填充前5个列表,然后删除顶部,并以2.5秒的间隔添加下一个列表。在完成整个列表之后,我需要点击服务器获取最新的列表,然后重复,永远重复 我遇到的问题是“永远”的方面。虽然第一个负载很好,循环工作得很好,但第二个负载有问题。如果//get_users_online_today();如果未注释,则似乎调用发生在第一个setTimeout()触发器完成后 我似乎不知道该将函数放在函数中的何处,以便重复调用它

我正在做一个项目,需要在一个表格中在线滚动用户列表。其思想是服务器对整个列表执行ping操作,它填充前5个列表,然后删除顶部,并以2.5秒的间隔添加下一个列表。在完成整个列表之后,我需要点击服务器获取最新的列表,然后重复,永远重复

我遇到的问题是“永远”的方面。虽然第一个负载很好,循环工作得很好,但第二个负载有问题。如果//get_users_online_today();如果未注释,则似乎调用发生在第一个setTimeout()触发器完成后

我似乎不知道该将函数放在函数中的何处,以便重复调用它

$(function(){
   function get_users_online_today(){
      var user = 0;

      $.ajax({
         url: 'ajax.php',
         data: {action: 'Users Online Today'},
         dataType: 'json'
      }).done(function(users){
         $.each(users, function(index, details){
            if($('#users_online_today tbody tr').length <= 5){
               $('#users_online_today tbody').append('<tr><td>' + details.name + '</td></tr>');
            }else{
               setTimeout(function(){
                  $('#users_online_today tbody tr:first').remove();
                  $('#users_online_today tbody').append($('<tr><td>' + details.name + '</td></tr>').fadeIn(250));
               }, (user++) * 2500);
            }
         });

         //get_users_online_today();
      });
   }

   get_users_online_today();
});
$(函数(){
函数get_users_online_today(){
var用户=0;
$.ajax({
url:'ajax.php',
数据:{操作:'今日在线用户'},
数据类型:“json”
}).done(功能(用户){
$.each(用户、功能(索引、详细信息){

if($('#users_online_today tbody tr').length在setTimeout周围添加一个闭包,以便它正确引用循环中的用户,应该可以解决您的问题。现在代码中出现的情况是,当setTimeout实际发生时,它正在查看以前范围内的“user”(最后一个用户),而不是包含正确值的局部作用域变量

(function(i, d){
  setTimeout(function(){
    $('#users_online_today tbody tr:first').remove();
    $('#users_online_today tbody').append($('<tr><td>' + d.name + '</td></tr>').fadeIn(250));
  }, (i + 1) * 2500);
}(index, details));
(功能(i,d){
setTimeout(函数(){
$(“#用户_online_today tbody tr:first”).remove();
$(“#用户_online_today tbody”).append($(''+d.name+'').fadeIn(250));
}(i+1)*2500);
}(索引、详情);
您实际上也不需要该用户变量,因为您在.each()函数中传递用户的索引。除非您出于其他原因使用该变量,在这种情况下,只需在超时函数之前/之后将其设置为+=1即可

下面是关于闭包是什么以及它们为什么有用的更好的解释:
(用户+=1)*2500
yikes在这个符号上……我个人不会像你那样做,但是为了保持你的路径,你为什么不在每个之后再加一个超时,延迟比最后一个多一个呢。@epascarello-Ya,那个用户+=1是因为我认为我可以在那里定义变量,而不是在上面定义变量。如上所述。@epascar阿雷洛你的想法调用一个次要的setTimeout似乎工作得相当好。