Intereting Posts
Есть ли способ использовать PHP WebSocket в Heroku ?, кажется, по умолчанию есть только поддержка других технологий Горячая клавиша в PhpStorm для перехода к тегу HTML end передача PHP-переменных через javascript windows.open на другую страницу PHP размер сеанса в кодеригнере Надежно оценить простые математические данные Начало транзакции не определено как преобразовать файл php в файл PDF Как отправить PHP-почту на несколько адресов электронной почты, полученных через MySQL-запрос Лучшее место для хранения больших объемов данных сеанса PHP заполняет данные из базы данных при выборе района Как написать значения, поступающие из ввода формы в json, используя php изменить имя json key Автоматический перезапуск PHP-скрипта на выходе PHP Переименовать имя файла, если оно существует. Отправка HTML-сообщения через PEAR при использовании аутентификации SMTP возвращает ошибку

Пока цикл не закончится, когда я расскажу об этом в JavaScript

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) – цикл входит в бесконечный цикл (и он продолжает запрашивать последнюю запись, навсегда … до тех пор, пока скрипт становится «невосприимчивым»)

Related of "Пока цикл не закончится, когда я расскажу об этом в JavaScript"

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, браузер будет зависать до тех пор, пока не будет доступен ответ. Возможно, ваш скрипт не застрял в бесконечном цикле, он просто ждет ответа.

Убедитесь, что скрипт на стороне сервера работает.