2011-12-28 49 views
5
function genTask(elem){ 
    elem.each(function(){ 
     $this=$(this).parent('.cntTasks'); 
     var pattern=/taskId-(.*)$/ 
     var idTask=$this.attr('id').match(pattern); 
     var data='id_task='+idTask[1]; 
     if(typeof jsVar2 !='undefined') data+=jsVar2; 
     $.ajax({ 
      type: "POST", 
      url: domain+"/view_tasks/gen_tasks/", 
      dataType: 'html', 
      data: data, 
      success: function(dt){ 
       $this.find('.contChildTasks').html(dt); 
       childs=$this.children('.taskDesc').find('.has_child'); 
       if(childs.length!=0) 
        genTask(childs); 
       } 
      } 
     }); 
     $this.find('.taskDesc').show(); 

    }); 
} 

if(typeof jsVar2 !='undefined') genTask($('.cntTasks .has_child')); 


});  

如何能够使$.each等到动作$.ajax将完成,然后继续循环,我不能得到$这个变种,因为它的最后一个值,对不起我的英文,谢谢!

+0

也许你可以将$ .ajax的'async'属性设置为'false'?见:http://api.jquery.com/jQuery.ajax/ – Armin 2011-12-28 15:01:34

回答

14

选项1:切换到数组中success处理程序中的下一个元素。

选项2:制作Ajax请求同步:

  • 全球:

    $.ajaxSetup({ async: false }); 
    
  • 在请求

    或直接:

    $.ajax({ 
        async: false, 
        type: "POST", 
        url: domain+"/view_tasks/gen_tasks/", 
        dataType: 'html', 
        data: data, 
        success: function(dt){ 
         $this.find('.contChildTasks').html(dt); 
         childs=$this.children('.taskDesc').find('.has_child'); 
         if(childs.length!=0) 
          genTask(childs); 
         } 
        } 
    }); 
    
+0

谢谢,它的作品:) – mIRU 2011-12-28 15:16:53

+0

工程很好..... – 2014-03-14 08:35:20

+0

完美 - 谢谢! – yab86 2016-04-30 17:43:26

0

尝试把ajaxsetup({asynch:false});在你的每个循环之前 然后在循环之后将其重置为真,以便你将来的ajax请求仍然可以不起作用

0

设置async为false致电。

0

在你的$.ajax呼叫添加async: false,它会发送一个阻止请求。

+1

请问downvoter能解释一下吗? – ridecar2 2015-06-29 13:05:59