У обратного вызова Ajax недостаточно времени для запуска

#javascript #jquery #ajax #firefox

Вопрос:

У меня проблема с Firefox, и мне нужно выяснить, в чем причина такого поведения, потому что это проблема в производственной среде.

Ситуация такова, что мне нужно отправить асинхронный запрос, JQuery.ajax и большую часть времени он отлично работает, но есть некоторые случаи, когда ответ не хватает времени, чтобы быть доставлены в функцию обратного вызова, хотя ответ был отправлен на сервер в ту же секунду, как вы можете видеть в этих журналах и код, где вы можете сопоставить каждое сообщение журнала, и Нюхач захвата, чтобы увидеть время запросу:

  1. 15:00:00 его запрос будет отправлен. 1.1. Информация о запросе до момента или после его запуска.
  2. 15:00:05 Ответ на запрос доставлен, но прибыл на 5 секунд позже, чем ответ, зарегистрированный в сниффере, как вы можете видеть далее.
 // 1.
15:00:00 [iframe.webservices.webservicesScheduleGet] time1=00:00:01, time2=23:59:59 utils.js:10:10

// 1.1
[api.webservices.invoke] (schedule): webservices.js:26:11
[api.webservices.invoke] method=Get webservices.js:27:11
[api.webservices.invoke] params=ini=00:00:01amp;fin=23:59:59 webservices.js:28:11
[api.webservices.invoke] expecting=text webservices.js:29:11
Este sitio usa el certificado SHA-1; se recomienda que uses los certificados con algoritmos de firma que utilicen las funciones hash más fuertes que SHA-1. Get

// 2
[api.webservices.invoke] (schedule) on complete webservices.js:40:13
[api.webservices.invoke] status=200 (OK) webservices.js:41:13
15:00:05 [iframe.webservices.webservicesScheduleGetComplete] text=True utils.js:10:10
15:00:05 [iframe.messages.messagesScheduleCheck] message=[{"M_TYPE":113,"RESULT":"true"}] utils.js:10:10
 

Это и есть код:

 function webservicesScheduleGet(time1, time2)
{
    consoleLog("[iframe.webservices.webservicesScheduleGet] time1="   time1   ", time2="   time2);

    if (webservicesAvoidRequest())
        return;

    var method = "Get";
    var params = "ini="   time1   "amp;fin="   time2;
    scheduleWebService.invoke(method, params, webservicesScheduleGetComplete, webservicesScheduleOnError, "text");
}

function WebServices ()
{
    //...
    this.invoke = function (method, params, onComplete, onError, dataType)
    {
        if (this.wsName === null)
        {
            console.warn("[api.webservices.invoke] the webservice is not initialized yet");
            return;
        }

        console.log("[api.webservices.invoke] ("   this.wsName   "):");
        console.log("[api.webservices.invoke] method="   method);
        console.log("[api.webservices.invoke] params="   params);
        console.log("[api.webservices.invoke] expecting="   dataType);

        $.ajax({
            type: "GET",
            url: this.remoteUrl   "/"   method,
            data: params,
            contentType: "application/x-www-form-urlencoded; charset=UTF-8",
            dataType: dataType,
            context: this,
            complete: function (response)
            {
                console.log("[api.webservices.invoke] ("   this.wsName   ") on complete");
                console.log("[api.webservices.invoke] status="   response.status   " ("   response.statusText   ")");
                if (response.status !== 200)
                {
                    console.warn("[api.webservices.invoke] error in response: status="   response.status);
                    return;
                }
                onComplete(response.responseText);
            },
            error: function (response)
            {
                console.warn("[api.webservices.invoke] ("   this.wsName   ") on error");
                console.warn("[api.webservices.invoke] error in response: text="   response.responseText);
                onError();
            }
        });
    };
};

function webservicesScheduleGetComplete(text)
{
    consoleLog("[iframe.webservices.webservicesScheduleGetComplete] text="   text);
    
    messagesScheduleCheck(text.toLowerCase());
}

 

Анализатор показывает, что время между запросом и ответом составляет менее 1 секунды, но оно (ответ) было доставлено на обратный вызов через 5 секунд. IP-адрес рабочей станции-172.29.150.9, а Ip — адрес сервера-172.31.101.83.

введите описание изображения здесь

Важно учитывать, что этот сценарий является частью решения, встроенного в другой основной продукт, интерфейс агента, который выполняет еще один асинхронный запрос с помощью ajax, но не одновременно с этим.

  • Операционная система-64-разрядная Windows 7 Professional.
  • Браузер Firefox 72.0.1 на 64 бит.
  • Процессор-процессор Intel Core i3-6100 с частотой 3,70 ГГц.
  • Объем оперативной памяти составляет 8 ГБ.

Заранее спасибо.

Комментарии:

1. Я вижу 2 исходящих сообщения с рабочей станции на сервер, разделенные 9 секундами, вероятно, задержка, которую вы заметили в обработчике ajax. Похоже, сервер не ответил на первый запрос, поэтому он был отправлен повторно. Обратите внимание на последовательность 1206 клиента в пакете 35405, за которой следует повторная последовательность 1205 клиента в пакете 38821. Похоже, что пакет был сброшен по пути на сервер. Может быть, это может произойти из-за шума линии?

2. Я так не думаю, это сообщения о сохранении жизни, которые отправляются, потому что браузер использует постоянные соединения. Кроме того, пакет 35405 является Ack рабочей станции, что означает, что ответ получен. По этим причинам я не думаю, что этот ответ (пакет 35359) был передан повторно.