2016-02-12 4 views
1

У меня есть серия вложенных асинхронных вызовов, которые нужно завершить до моего кода. Функция save_part1 вызывает базу данных sqlite и возвращает интересующие строки. Для каждой из этих строк я делаю вызов ajax для сохранения их удаленно.Подождите, пока завершатся вложенные асинхронные вызовы

Из того, что я прочитал о обещаниях и отложенных, я видел, что они используются только в контексте вызовов ajax. И вдобавок ко всему, это заставляет мой мозг болеть.

Вопрос: как подождать, пока все вызовы ajax не будут завершены до запуска save_part2?

function save() 
{ 
    save_part1(); 
    //this should only happen after all the ajax calls from save_part1 are complete 
    save_part2(); 
} 
function save_part1() 
{ 
    db.transaction(function (tx) { 
     tx.executeSql("SELECT * FROM TABLE1", [], 
      function (transaction, results) { 
       for (var i = 0; i < results.rows.length; i++) 
       { 
        var row = results.rows.item(i); 

        ajaxCall_item1(row); 

       } 
      }, errorHandler) 
    }); 
} 

function save_part2() 
{ 
    db.transaction(function (tx) { 
     tx.executeSql("SELECT * FROM TABLE2", [], 
      function (transaction, results) { 
       for (var i = 0; i < results.rows.length; i++) 
       { 
        var row = results.rows.item(i); 

        ajaxCall_item2(row); 

       } 
      }, errorHandler) 
    }); 
} 
+0

Как выглядит ajaxCall_item? –

+0

Возможный дубликат [Как подождать, пока завершатся вложенные запросы async jQuery AJAX?] (Http://stackoverflow.com/questions/8097516/how-to-wait-until-nested-async-jquery-ajax-requests-have -finished) – Ageonix

+0

Вы ищете что-то, как описано на http://api.jquery.com/ajaxcomplete/. Вы можете сделать еще один вызов ajax, используя ajaxComplete. – user3509208

ответ

1

До тех пор, пока у вас есть ajaxCall_item возвращение JQuery отложенного объекта, вы можете иметь save_part1 вернуть отложенный объект, собирать возвращенные обещания в массив, назовут их с $.when и решить «обещание» сразу все из запросы завершены. Тогда вы сможете написать: save_part1().then(save_part2);. Вот непроверенный пример:

function save() { 
    save_part1().then(save_part2).fail(function(err) { 
     // ohno 
    }); 
} 

function ajaxCall_item1(row) { 
    return $.ajax({ ... }); 
} 

function save_part1() 
{ 
    var dfd = jQuery.Deferred(); 
    var promises = []; 
    db.transaction(function (tx) { 
    tx.executeSql("SELECT * FROM TABLE1", [], 
     function (transaction, results) { 
     for (var i = 0; i < results.rows.length; i++) { 
      var row = results.rows.item(i); 
      promises.push(ajaxCall_item1(row)); 
     } 

     $.when.apply($, promises).then(function() { 
      dfd.resolve.apply(dfd, arguments); 
     }); 
     }, function(err) { 
     dfd.reject(err); 
     }); 
    }); 
    return dfd; 
} 
Смежные вопросы