@VadimRublev
Go, front-end (ванильный).

Почему тайм-аут ожидания ответа сервера не работает нормально?

После установки тайм-аута ожидания ответа сервера перестала работать форма в браузере. Запрос нормально уходит на сервер; и сервер нормально отвечает. Но клиент ответ не принимает нормально.
С событиями onload и onloadend вообще не работает - после отправки запроса тупо стоит форма на месте (т. е. ничего на клиенте не происходит). С событием onreadystatechange работает некорректно - срабатывает сразу, и после истечения тайм-аута ещё.
Как правильно записать? С событием onload или onloadend. Устаревшее onreadystatechange не хочется использовать.
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    // При неуспешном ответе - завершаем процесс запроса.
    if (xhr.readyState != 4) {
        return;
    } else {
    // (Иначе) При успешном ответе (readyState = 4) - очищаем отсчёт тайм-аута.
        clearTimeout(xhrTimeout);
    }

    // Отсчёт тайм-аута.
    let xhrTimeout = setTimeout(function() {
        xhr.abort()
        alert('Истек тайм-аут ожидания ответа сервера.');
    }, 5000);

    if (xhr.status === 200) {
        _функционал при успешном ответе сервера_
        return;
    } else {
        _функционал при неуспешном ответе сервера_
        return;
    }
}

// При неудачном запросе (нет ответа сервера, по любой причине)
xhr.onerror = function() {
    alert("Запрос не удался.");
}

xhr.open('POST', '/testRout', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send("id_Name=" + encodeURIComponent(value_Input1) + "&id_Nick=" + encodeURIComponent(value_Input2));   // Отправка запроса.
  • Вопрос задан
  • 292 просмотра
Решения вопроса 1
@Che603000
c 2011 javascript
let xhr = new XMLHttpRequest();

    // Отсчёт тайм-аута вынести из обработчика
let xhrTimeout = setTimeout(function() {
        xhr.abort()
        alert('Истек тайм-аут ожидания ответа сервера.');
 }, 5000);

xhr.onreadystatechange = function() {
    // выключить тайм-аут 
    clearTimeout(xhrTimeout);

    // При неуспешном ответе - завершаем процесс запроса.
    if (xhr.readyState != 4) {
        return;
    } 

    if (xhr.status === 200) {
        _функционал при успешном ответе сервера_
        return;
    } else {
        _функционал при неуспешном ответе сервера_
        return;
    }
}
....
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@kttotto
пофиг на чем писать
Наверное потому, что clearTimeout(xhrTimeout) срабатывает раньше, чем проинициализируется xhrTimeout и на клиенте падает с ошибкой.
Александр Черемхин Вам правильно написал, сначала инициализация xhrTimeout, а потом только вызов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы