каждый ждать, пока не закончится $ .ajax, а затем продолжить - PullRequest
7 голосов
/ 28 декабря 2011
    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, а затем продолжить цикл, я не могу получить $ this var, потому что он имеет последнее значение, извините за мой английский, СПАСИБО! !!

Ответы [ 4 ]

15 голосов
/ 28 декабря 2011

Опция 1: переключиться на следующий элемент в вашем массиве в обработчике success.

Опция 2: синхронно выполнять запросы ajax:

  • global:

     $.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 голосов
/ 28 декабря 2011

В вашем $.ajax вызове добавьте async: false, и он отправит запрос на блокировку.

0 голосов
/ 28 декабря 2011

Установите для async значение false при вызове $.ajax.

0 голосов
/ 28 декабря 2011

попробуй поставить ajaxsetup ({asynch: false});перед каждым вашим циклом, затем после цикла сбросьте его обратно в true, чтобы ваш будущий ajax-запрос все еще мог быть asych

...