var hasData = '1'; while (hasData != 0) { $.ajax({ url: '/ajax.php?updateRow='+hasData, dataType: 'json', async: false, success: function(data) { hasData = data.next; $('.result').append(data.html); } });
Что должно произойти: JSON Array вытащил из PHP ([html] и [next]). Если [next] установлен в 0 (когда больше нет записей), цикл while останавливается и должен быть этим.
Что происходит: все, что должно, кроме – когда выполняется требование while () (поэтому, когда hasData установлено в 0) – цикл входит в бесконечный цикл (и он продолжает запрашивать последнюю запись, навсегда … до тех пор, пока скрипт становится «невосприимчивым»)
ajax
отправляет запрос и выполняет обратный вызов, когда есть ответ. Итак, что происходит:
потому что он находится внутри цикла while. Вы забиваете свой сценарий запросами, а сервер получает кучу запросов, которые, вероятно, не могут обрабатывать.
Редактировать: Извините, я пропустил async: false
. Однако это всегда делает браузер безответственным. Лучше всего было бы использовать async: true
и fire another, если условное говорит так, но только после того, как вы получите ответ:
function check() { $.ajax({ url: '/ajax.php?updateRow='+hasData, dataType: 'json', async: true, success: function(data) { hasData = data.next; $('.result').append(data.html); if(hasData != 0) check(); // do it again } }); } check(); // fire the first request
Как отметил Spycho, поскольку вы получаете JSON, более удобным способом может быть:
(function() { var fireRequest = function() { // this function is not available anywhere else, // to avoid having this process running more than once $.getJSON('/ajax.php', {updateRow: hasData}, function(data) { hasData = data.next; $('.result').append(data.html); if(hasData != 0) fireRequest(); // do it again }); }; fireRequest(); // start the process })(); // call it
Фактически, то, что делает ваш код, находится недалеко от атаки «Отказ в обслуживании» на вашем собственном сервере 🙂
Запросы Ajax не будут блокироваться до тех пор, пока они не будут завершены, как уже указывали другие. Вызов $.ajax
немедленно возвращается, фактический запрос выполняется в фоновом режиме и вызывает обратный вызов success
после завершения. Все это означает, что Javascript проходит через while
так быстро, как может, потому что ничего не останавливает его. Это также означает, что, пока ваш первый запрос пытается закончить, Javascript, вероятно, породил тысячи новых запросов, которые все нужно обработать сервером.
Ваш сервер будет неудобно обслуживать так много запросов одновременно и замедляется (если вы проверите его использование процессора и памяти, вы заметите). Из-за замедления сервера Javascript будет появляться все больше и больше запросов … пока, наконец, вся система не остановится, потому что у Javascript также не хватает ресурсов и вашего сервера.
Цикл while не рекомендуется в вашем случае. Лучше отправлять один запрос одновременно и проверять возвращаемое значение внутри обратного вызова. Если это еще не 0, введите другой запрос и повторите процедуру.
function updateRows(onCompleted) { $.ajax({ url: '/ajax.php?updateRow='+hasData, dataType: 'json', success: function(data) { hasData = data.next; if (hasData == 0) { return onCompleted(); } $('.result').append(data.html); updateRows(onCompleted); // not finished yet, recursion } }); }
Аргумент onCompleted
будет функцией обратного вызова, которая будет выполняться после завершения процедуры обновления. Вы можете использовать его следующим образом:
updateRows(function() { // Now all rows are updated // Proceed with program flow });
Первая буква в AJAX означает «асинхронный». Браузер не ждет ответа после начального $.ajax()
, но вызывает эту функцию много раз.
var hasData = 1; function ajaxRequest() { $.ajax({ //... success: function(data) { hasData = data.next; $('.result').append(data.html); if (hasData != 0) { ajaxRequest(); } } }); }
также я предлагаю вам отбросить данные ответа на номер, например
hasData = data.next * 1;
так как иногда даже если JSON возвращает число, его не считается числом по javascript и сравнению
hasData! = 0
выполняется, даже если hasData = "0" …
Поскольку вы настроили async на false, браузер будет зависать до тех пор, пока не будет доступен ответ. Возможно, ваш скрипт не застрял в бесконечном цикле, он просто ждет ответа.
Убедитесь, что скрипт на стороне сервера работает.