Вопрос по jquery, callback, ajax – Запуск обратного вызова после выполнения нескольких запросов AJAX
<code>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) } </code>
(Изменено много, так как это часть класса и т. Д. И т. Д.)
На данный момент это выглядит немного хакерским, поскольку использование таймера кажется мусором. Я бы использовал $ .when и $ .done, но я не знаю, сколько там может быть комнат, поэтому я не знаю, куда и во что положить.
Как я могу гарантировать, что run_the_rest_of_the_app () вызывается только после того, как все запросы AJAX возвращаются?
2
ответа
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);
}
У меня также есть один дополнительный перед $ .each, так что, может быть, он завершится до того, как будет запущен первый $ .getJSON? Weird. В конце концов, я остался с версией моего таймера для мусора, так как мне нужна была строка состояния, и это было легко сделать!
Rich Bradshaw
Странно, но это не сработало в моем тестировании. бит done срабатывает до того, как запросы выполняются довольно часто. Странный.
Rich Bradshaw