
26.12.2023, 10:23
|
Интересующийся
|
|
Регистрация: 26.12.2023
Сообщений: 11
|
|
Ajax запрос блокирует обмен данными с сервером
Есть самописный сайт, отлаживаемый на OpenServer. При написании клиентской части используются асинхронные ajax-запросы.
Возникла следующая проблема: после начала выполнения запроса (свойство readyState получает значение = 1 (OPENED)) и до его окончания пропадает возможность обмениваться данными с сервером, тоесть не работают ссылки на сайте, не перезагружается страница и т.д. сайт виснет.
В тоже время другие скрипты на клиентской части выполняются. Например, открываются модальные окна, привязанные к js и т.д.
Явно дело не в серверной части, потому что сайт открытый в другом браузере на этой же машине работает нормально, браузер нормально обменивается данными с сервером.
Вот код используемого запроса:
function ajaxRequest(address, params, functionName){
var request = false;
try{
request = new XMLHttpRequest();
if (request.overrideMimeType){
request.overrideMimeType('text/xml');
}
} catch(e1){
try{
request = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e2){
try{
request = new ActiveXObject("Microsoft.XMLHTTP");
} catch(e3){}
}
}
if (!request) {
/*alert('Не вышло :( Невозможно создать экземпляр класса XMLHTTP '); */
return false;
}
request.onreadystatechange = function(){
if(this.readyState === 4){
if(this.status === 200){
if(this.responseText != null){
functionName(this.responseText);
return true;
}
else{
/*alert("Ошибка Ajax: данные не получены");*/
return false;
}
}
else {
/*alert("Ошибка Ajax: " + this.statusText);*/
return false;
}
}
}
request.open("POST", address, true)
if(!(params instanceof FormData)) request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.send(params);
}
С чем может быть связана проблема?
Последний раз редактировалось Magic Light, 26.12.2023 в 10:28.
|
|

26.12.2023, 13:42
|
 |
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
Magic Light, не вижу проблем в коде.
Попробуйте отказаться от устаревшего кода в пользу:
function ajaxRequest(address, params, functionName) {
fetch(address, {
method: 'POST',
body: params,
})
.then((response) => response.text())
.then((text) => functionName(text))
.catch((error) => console.error(error))
}
|
|

26.12.2023, 15:12
|
Интересующийся
|
|
Регистрация: 26.12.2023
Сообщений: 11
|
|
Сообщение от ruslan_mart
|
Magic Light, не вижу проблем в коде.
Попробуйте отказаться от устаревшего кода в пользу:
function ajaxRequest(address, params, functionName) {
fetch(address, {
method: 'POST',
body: params,
})
.then((response) => response.text())
.then((text) => functionName(text))
.catch((error) => console.error(error))
}
|
Попробовал, все то же самое 
|
|

26.12.2023, 16:00
|
 |
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
Magic Light, очевидно было, что проблема не здесь
Ищите проблему там, где вызываете ajaxRequest.
Возможно где-то в стилях ставится pointer-events: none и убирается когда отрабатывает колбэк functionName. Либо overlay какой-нибудь накладывается.
|
|

26.12.2023, 18:33
|
Интересующийся
|
|
Регистрация: 26.12.2023
Сообщений: 11
|
|
Сообщение от ruslan_mart
|
Magic Light, очевидно было, что проблема не здесь 
Ищите проблему там, где вызываете ajaxRequest.
Возможно где-то в стилях ставится pointer-events: none и убирается когда отрабатывает колбэк functionName. Либо overlay какой-нибудь накладывается.
|
Перепроверил никаких pointer-events: none не ставится, overlay не накладывается.
Пожалуйста, киньте в меня еще идеями, как такое может происходить...
|
|

26.12.2023, 19:41
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,767
|
|
Сообщение от Magic Light
|
тоесть не работают ссылки на сайте, не перезагружается страница и т.д. сайт виснет.
|
Все таки поясните, что там происходит.
Как я понял идет какой то продолжительный запрос. И за время этого запроса, вы не можете ни перейти по ссылке, ни перезагрузить страницу? Так?
А чего вы хотите добиться перейдя по ссылке или сделав перезагрузку? Новая страница то не будет обрабатывать этот запрос.
|
|

26.12.2023, 21:14
|
Интересующийся
|
|
Регистрация: 26.12.2023
Сообщений: 11
|
|
Сообщение от voraa
|
Все таки поясните, что там происходит.
Как я понял идет какой то продолжительный запрос. И за время этого запроса, вы не можете ни перейти по ссылке, ни перезагрузить страницу? Так?
А чего вы хотите добиться перейдя по ссылке или сделав перезагрузку? Новая страница то не будет обрабатывать этот запрос.
|
Да, так все и есть.
Проблема в том, что паралельно должны выполняться другие запросы. А именно - основной запрос запускает е-мейл рассылку, а другие запросы периодически получают данные о ходе выполнения этой рассылки.
|
|

26.12.2023, 22:11
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,767
|
|
Надо смотреть на возможные ограничения. В браузерах есть ограничение - не больше 6 одновременно открытых соединений.
Вроде есть какие-то ограничения в OpenServer на количество одновременных cgi задач. Вот только для вообще или с одной страницы - надо смотреть доки. Покопаться в настройках OpenServer.
Как часто вызываются другие запросы (и как?) Каковы они по продолжительности? Проходят или нет?
Последний раз редактировалось voraa, 26.12.2023 в 22:17.
|
|

26.12.2023, 22:25
|
Интересующийся
|
|
Регистрация: 26.12.2023
Сообщений: 11
|
|
Сообщение от voraa
|
Надо смотреть на возможные ограничения. В браузерах есть ограничение - не больше 6 одновременно открытых соединений.
Вроде есть какие-то ограничения в OpenServer на количество одновременных cgi задач. Вот только для вообще или с одной страницы - надо смотреть доки. Покопаться в настройках OpenServer.
Как часто вызываются другие запросы (и как?) Каковы они по продолжительности? Проходят или нет?
|
Запросы на получение данных о прогресе рассылки делаются через каждые 3 секунды. код следующий:
function formMailingsGetProgressDo(){
document.querySelectorAll('.mgr-mailings .status-in-progress').forEach(function (el){
let id = el.getAttribute('data-id');
let form = O('formMailingsGetProgress');
form.elements['mailingId'].value = id;
let formData = new FormData(form);
ajaxRequest('$host/$lang/manager/mailings/get-progress',
formData,
formMailingsGetProgressFinisher);
});
}
function formMailingsGetProgressFinisher(data){
let feedback = JSON.parse(data);
if(feedback.success){
let id = feedback.mailingId;
document.querySelector('.mgr-mailings #mailing-progress-' + id).innerHTML = feedback.progress;
}else {
console.log('Ошибка при получении прогресса рассылки: ' + feedback.msg)
}
}
function startMonitoring() {
formMailingsGetProgressDo();
setTimeout(startMonitoring, 3000);
}
startMonitoring();
Запросы на прогресс рассылки делаются, но результат их не возвращается. Выполнение всех таких накопившихся запросов происходит одним махом после получения ответа о завершении выполнения основного запроса.
|
|

26.12.2023, 22:57
|
Интересующийся
|
|
Регистрация: 26.12.2023
Сообщений: 11
|
|
В настройках OpenServer Количество процесов FastCGI = 6, при увеличении значения этого параметра, например, до 600, проблема остается.
|
|
|
|