Я использую Ajax-опрос для опроса сервера на процент выполнения. Если вам интересно, я не использую setInterval, так как это может привести к тому, что несколько запросов будут голодать друг у друга. Я использую setTimeout в «завершенном» обратном вызове jQuery.ajax () и устанавливаю время из 5000 мс для следующего запроса.
Таким образом, ajax-вызовы осуществляются с интервалами приблизительно 5-7 секунд (в зависимости от того, сколько времени потребовался предыдущий ajax-вызов, чтобы ответить, и он медленно прогрессирует от 0% до 100%.
Проблема в том, что, хотя кажется, что все сделанные ajax-вызовы работают нормально и почти вовремя, задерживается только последний ajax-вызов. И это не задерживается в получении ответа от сервера. Последний сам вызов ajax выполняется после очень большой задержки, около 2 минут.
Я искал и читал все подобные вопросы / ответы по SO, и мой сценарий кажется уникальным в том смысле, что задерживается только последний запрос статуса проверки, в то время как все остальные запросы работают нормально.
Журналы сервера для этого вызова ajax дают мне следующий шаблон почти во всех тестах (это пример):
- Ajax-запрос 1: выполнено за 0 секунд - возвращено 0% прогресса
- Ajax-запрос 2: выполнено за 7 секунд - возвращено 17% прогресса
- Ajax-запрос 3: выполнено за 13 секунд - возвращено 30% прогресса
- Ajax-запрос 4: выполнено за 20 секунд - возвращено 54% прогресса
- Ajax-запрос 5: выполнено за 157 секунд - Возвращено 100% прогресса
Мой код следующий, если он вам нужен:
var makeNextAjaxCall = true;
function ajaxCaller(url, data) {
$.post({
url: url,
data: data,
success: function(data){
if(data.progress === 100) {
makeNextAjaxCall = false;
}
},
complete: function() {
if(makeNextAjaxCall) {
setTimeout(function() {
ajaxCaller(url, data);
}, 5000);
}
}
});
}
Я потратил несколько дней, пытаясь найти причину, по которой последний ajax-вызов задерживается не только сервером, но и самим клиентом.