Я создаю сайт, используя Laravel и JQuery. Страница выдает несколько вызовов AJAX.
Один из этих вызовов может занять несколько секунд, и, похоже, он блокирует другие элементы страницы от загрузки. Сюда входят изображения и другие вызовы AJAX.
Мой код более или менее выглядит так.
$.ajax({
async: true,
url: url,
data: {
//data
},
success: function (response) {
//Process response (append html, images, etc.)
for (var key in response) {
newAJAXCall(response[key]);
}
},
error: function (xhr) {
}
});
Вызов newAJAXCall выглядит следующим образом:
$.ajax({
async: true,
url: url,
data: {
//data
},
success: function (response) {
//Process response
},
error: function (xhr) {
}
});
newAJAXCall является причиной проблемы. Некоторые вызовы выполняются в течение 200 мс. но некоторые могут занять несколько секунд. Когда это произойдет, если какие-либо элементы не загрузились, они перестанут загружаться.
В случае с изображениями html для них уже существует. Браузер просто перестает загружать их, пока не будет выполнен вызов AJAX.
Я уже пробовал устанавливать асинхронный режим и использовать таймаут, но ничего не исправляет. Проблема возникает как в Chrome, так и в Safari, поэтому она не является специфичной для браузера.
EDIT: даже когда for-loop удаляется, и новый вызов ajax выдается только после устранения проблемы, если вызов длится долго.
EDIT2: Возможно ли, что Laravel/Php ограничивает количество соединений, которые может открыть один клиент?
EDIT3: Кажется, мой сервер вызывает проблему. Когда я загружаю изображения с другого сервера, чем мои собственные, они загружаются штрафом во время запросов ajax.
Проблема заключалась в том, что мой сервер localhost не имел достаточной емкости. Когда сайт работает на моем выделенном сервере, все загружается нормально.
В соответствии с моим комментарием, пожалуйста, подумайте о том, чтобы положить цикл в функцию успеха newAJAXCall
$.ajax({
async: true,
url: url,
data: {
//data
},
success: function (response) {
//Process response (append html, images, etc.)
newAJAXCall(response);
},
error: function (xhr) {
}
});
function newAJAXCall(response) {
$.ajax({
async: true,
url: url,
data: {
//data
},
success: function (response) {
for (var key in response) {
//Process response[key]
}
},
error: function (xhr) {
}
});
}