Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.12.2023, 10:23
Интересующийся
Отправить личное сообщение для Magic Light Посмотреть профиль Найти все сообщения от Magic Light
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 26.12.2023, 13:42
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 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))
}
Ответить с цитированием
  #3 (permalink)  
Старый 26.12.2023, 15:12
Интересующийся
Отправить личное сообщение для Magic Light Посмотреть профиль Найти все сообщения от Magic Light
 
Регистрация: 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))
}
Попробовал, все то же самое
Ответить с цитированием
  #4 (permalink)  
Старый 26.12.2023, 16:00
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Magic Light, очевидно было, что проблема не здесь

Ищите проблему там, где вызываете ajaxRequest.

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

Сообщение от ruslan_mart Посмотреть сообщение
Magic Light, очевидно было, что проблема не здесь

Ищите проблему там, где вызываете ajaxRequest.

Возможно где-то в стилях ставится pointer-events: none и убирается когда отрабатывает колбэк functionName. Либо overlay какой-нибудь накладывается.
Перепроверил никаких pointer-events: none не ставится, overlay не накладывается.
Пожалуйста, киньте в меня еще идеями, как такое может происходить...
Ответить с цитированием
  #6 (permalink)  
Старый 26.12.2023, 19:41
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,767

Сообщение от Magic Light
тоесть не работают ссылки на сайте, не перезагружается страница и т.д. сайт виснет.
Все таки поясните, что там происходит.
Как я понял идет какой то продолжительный запрос. И за время этого запроса, вы не можете ни перейти по ссылке, ни перезагрузить страницу? Так?
А чего вы хотите добиться перейдя по ссылке или сделав перезагрузку? Новая страница то не будет обрабатывать этот запрос.
Ответить с цитированием
  #7 (permalink)  
Старый 26.12.2023, 21:14
Интересующийся
Отправить личное сообщение для Magic Light Посмотреть профиль Найти все сообщения от Magic Light
 
Регистрация: 26.12.2023
Сообщений: 11

Сообщение от voraa Посмотреть сообщение
Все таки поясните, что там происходит.
Как я понял идет какой то продолжительный запрос. И за время этого запроса, вы не можете ни перейти по ссылке, ни перезагрузить страницу? Так?
А чего вы хотите добиться перейдя по ссылке или сделав перезагрузку? Новая страница то не будет обрабатывать этот запрос.
Да, так все и есть.
Проблема в том, что паралельно должны выполняться другие запросы. А именно - основной запрос запускает е-мейл рассылку, а другие запросы периодически получают данные о ходе выполнения этой рассылки.
Ответить с цитированием
  #8 (permalink)  
Старый 26.12.2023, 22:11
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,767

Надо смотреть на возможные ограничения. В браузерах есть ограничение - не больше 6 одновременно открытых соединений.
Вроде есть какие-то ограничения в OpenServer на количество одновременных cgi задач. Вот только для вообще или с одной страницы - надо смотреть доки. Покопаться в настройках OpenServer.

Как часто вызываются другие запросы (и как?) Каковы они по продолжительности? Проходят или нет?

Последний раз редактировалось voraa, 26.12.2023 в 22:17.
Ответить с цитированием
  #9 (permalink)  
Старый 26.12.2023, 22:25
Интересующийся
Отправить личное сообщение для Magic Light Посмотреть профиль Найти все сообщения от Magic Light
 
Регистрация: 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();

Запросы на прогресс рассылки делаются, но результат их не возвращается. Выполнение всех таких накопившихся запросов происходит одним махом после получения ответа о завершении выполнения основного запроса.
Ответить с цитированием
  #10 (permalink)  
Старый 26.12.2023, 22:57
Интересующийся
Отправить личное сообщение для Magic Light Посмотреть профиль Найти все сообщения от Magic Light
 
Регистрация: 26.12.2023
Сообщений: 11

В настройках OpenServer Количество процесов FastCGI = 6, при увеличении значения этого параметра, например, до 600, проблема остается.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обмен данными через тср на низком уровне s868 AJAX и COMET 19 26.11.2021 15:07
Асинхронный ajax запрос imonzx AJAX и COMET 3 13.06.2015 00:02
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 14:05
Составить Ajax запрос и json LASSO jQuery 1 16.02.2012 03:36
ajax запрос с подгружемным js HelpeR AJAX и COMET 1 27.10.2008 12:44