2017-02-20 25 views
0

У меня возникла проблема с операцией async. Мне нужно знать, когда будет создан мой стол. Но таблица создается из информации из базы данных, полученной с помощью ajax.Выполнение обратного вызова внутри обратного вызова

Это будет мой начальной точкой, где мне нужно знать, что данные извлекаются и таблица генерируется:

generateTable(function(r){ 

}); 

Здесь я получать информацию из БД и передавать их в функцию обратного вызова

function getRepairBook(callback) { 
      $.ajax({ 
       method: "GET", 
       dataType: "json", 
       contentType: "application/json", 
       url: "x", 
       success: function(response){ 
        callback(response); 
       }, 
       error: function(response){ 

       } 
      }); 
     } 

здесь мне нужен обратный вызов для функции обратного вызова. Но я понятия не имею, как это сделать:

function generateTable(callback) { 

//callback of AJAX 
    getRepairBook(function (response) { //, callback 

    console.log(response); 
    $('#repTable >tbody').html(""); 

    var trHTML = ''; 
    $.each(response, function (i, item) { 

     //... 
     //build table 
    }); 
    $('#repTable >tbody').append(trHTML); 
    //need a callback of this callback function 
    //callback(); 
    }); 

    callback(); 
} 
+0

Нужно ли использовать обратные вызовы? Можете ли вы использовать [Обещания] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) или [асинхронные функции] (https://developer.mozilla.org/EN-US/Docs/Web/JavaScript/Справка/Заявления/async_function)? – wing

+1

Вот почему мы придумали Обещания. Добавьте второй обратный вызов к ajax-вызову первого: 'success: function (response) {callback (response, otherCallback);}' и 'getRepairBook (function (response), otherCallback)' Вы можете вложить столько, сколько хотите, но в конечном итоге с pryamid гибели. ;) – Shilly

ответ

0

Попробуйте

function getRepairBook(callback) { 
      $.ajax({ 
       method: "GET", 
       dataType: "json", 
       contentType: "application/json", 
       url: "x", 
       success: function(response){ 
        callback(response); 
        generateTable(response);//calling this on success of ajax call 
       }, 
       error: function(response){ 

       } 
      }); 
     } 
+0

Я также думал об этом, но мне он нужен как переменный, как показано выше. Мне нужно выполнить различные действия после создания таблицы – BayLife

+0

, а затем изменить 'getRepairBook (функция (ответ) {' to 'getRepairBook (функция (обратный вызов) {' –

0

Вы можете цепи JQuery deferred объекты. Они работают так:

function foo() { 
 
    // initialize the deferred 
 
    var dfd = $.Deferred(); 
 
    
 
    // resolve the deferred after 2 sec 
 
    setTimeout(function() { 
 
    dfd.resolve(); 
 
    }, 2000); 
 
    
 
    // return the promise 
 
    return dfd.promise(); 
 
} 
 

 
function bar() { 
 
    var dfd = $.Deferred(); 
 
    // resolve the deferred after 1 sec 
 
    setTimeout(function() { 
 
    dfd.resolve(); 
 
    }, 1000); 
 
    return dfd.promise(); 
 
} 
 

 
$(function() {  
 
    var dfd = foo(); 
 
    // when foo has been resolved 
 
    dfd.then(function() { 
 
    alert('foo has been resolved'); 
 
    var dfd2 = bar(); 
 
    // when bar has been resolved 
 
    dfd2.then(function() { 
 
     alert('bar has been resolved'); 
 
    }); 
 
    }); 
 
    
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

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