Запуск обратного вызова после выполнения нескольких запросов AJAX

9
loadInfo: function(){
    var jsonCounter = 0,
    room = ['room1','room2','room3'],
    dates = [],
    prices = []

    $.each(booking.rooms, function(key, room_name) {
        $.getJSON('/get_info.php?room='+room_name, function(data) {
            dates[room_name] = data
            jsonCounter++
        })
        $.getJSON('/get_info.php?room='+room_name+'&prices', function(data) {
            prices[room_name] = data
            jsonCounter++
        })

    })

    function checkIfReady() {
        if (jsonCounter === rooms.length * 2) {
            clearInterval(timer)
            run_the_rest_of_the_app()
        }
    }

    var timer = setInterval(checkIfReady, 100)

}

(Изменено много, как часть класса и т.д.)

В настоящий момент это кажется немного хакерским, поскольку использование таймера кажется мусором. Я бы использовал $.when и $.done, но я не знаю, сколько комнат там может быть, поэтому я не знаю, что включить.

Как я могу гарантировать, что run_the_rest_of_the_app() будет вызван только после того, как все запросы AJAX вернутся?

Теги:
callback

2 ответа

19
Лучший ответ
  • var activeAJAX = 0;

  • Перед выполнением вызова AJAX activeAJAX++;

  • После завершения вызова AJAX (в обратном вызове): if (--activeAJAX == 0) { allDone(); }

4

Вот как использовать /done

loadInfo: function(){
    var room = ['room1','room2','room3'],
    dates = [],
    prices = [],
    requests = [];

    $.each(booking.rooms, function(key, room_name) {
        var aRequest;

        aRequest = $.getJSON('/get_info.php?room='+room_name, function(data) {
            dates[room_name] = data;
        });
        requests.push(aRequest);

        aRequest = $.getJSON('/get_info.php?room='+room_name+'&prices', function(data) {
            prices[room_name] = data;
        });
        requests.push(aRequest);

    })

    $.when.apply($, requests).done(run_the_rest_of_the_app);
}
  • 0
    Странно, это не работает в моем тестировании. бит done срабатывает до того, как запросы выполняются довольно часто. Странный.
  • 0
    Хм ... мне интересно, видим ли мы состояние гонки между отдельными обратными вызовами success и done обратным вызовом группы. Запросы действительно не выполнены? или просто их обратный вызов не вызывается при done готового обратного вызова?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню