#javascript #jquery #ajax #firefox
Вопрос:
У меня проблема с Firefox, и мне нужно выяснить, в чем причина такого поведения, потому что это проблема в производственной среде.
Ситуация такова, что мне нужно отправить асинхронный запрос, JQuery.ajax
и большую часть времени он отлично работает, но есть некоторые случаи, когда ответ не хватает времени, чтобы быть доставлены в функцию обратного вызова, хотя ответ был отправлен на сервер в ту же секунду, как вы можете видеть в этих журналах и код, где вы можете сопоставить каждое сообщение журнала, и Нюхач захвата, чтобы увидеть время запросу:
- 15:00:00 его запрос будет отправлен. 1.1. Информация о запросе до момента или после его запуска.
- 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) был передан повторно.