Опрос Ajax кажется зависшим ТОЛЬКО по последнему запросу - PullRequest
2 голосов
/ 28 апреля 2019

Я использую 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-вызов задерживается не только сервером, но и самим клиентом.

...