Как обращаться с сетью:: ERR_CONNECTION_REFUSED в jquery ajax
У меня есть такой javascript:
$.ajax({
url: "//myapi.com/json",
dataType: "jsonp"
}).done(function (data) {
selectText('Id', data.country);
}).fail(function (jqXHR, textStatus, errorThrown) {
var defaultOption = 'US'
selectDropdownByText('Id', defaultOption);
console.log(errorThrown);
});
Но дело в том, что https-запрос мой ajax не работает, потому что служба, которую я вызываю, недоступна через https, и я получаю сообщение об ошибке :ERR_CONNECTION_REFUSED
- так что все в порядке, я просто хочу обработать это. У меня есть .fail
в ajax-вызове, но он не обрабатывает :ERR_CONNECTION_REFUSED
Не могли бы вы дать совет о том, как обращаться с :ERR_CONNECTION_REFUSED
в этом случае?
Я также пытался обернуть мой вызов ajax блоку try-catch
, но он тоже не работал.
Ответы
Ответ 1
Вы можете использовать свойство timeout
$.ajax
для запуска обратного вызова error
.
Это позволит убедиться, что обратный вызов error
запущен, если сервер не отвечает в течение определенного срока.
$.ajax({
url: "//myapi.com/json",
dataType: "jsonp",
timeout: 15000 // adjust the limit. currently its 15 seconds
}).done(function (data) {
selectText('Id', data.country);
}).fail(function (jqXHR, textStatus, errorThrown) {
var defaultOption = 'US'
selectDropdownByText('Id', defaultOption);
console.log(errorThrown);
});
Это вызовет обратный вызов fail
, когда нет интернета.
Ответ 2
Похоже, что когда jqXHR.readyState(то есть поле readyState первого параметра метода $.ajax(...). fail()) равно 0, произошла сетевая ошибка. Тем не менее, я не смог выяснить, что такое точная сетевая ошибка через JavaScript.
Я просмотрел код jQuery Ajax, и xhr.send() (т.е. метод XMLHttpRequest.send()) (который генерирует сетевую ошибку) не улавливает и не выдает ошибку. Таким образом, это невозможно поймать.
Похоже, браузер обнаруживает и отображает правильное сообщение об ошибке, но jQuery не обращает внимания на определенный тип сетевой ошибки.
Ответ 3
Итак, fail
вызывается, если мы получаем ERR_CONNECTION_REFUSED
, но нет никакого способа увидеть, почему вызывается fail
. Есть ли способ обнаружить внутри метода отказа, почему все не удалось? то есть время ожидания или соединение отклонено? Есть разница между ними. Один, который я мог бы повторить, другой не имеет значения.
Вам не нужно устанавливать таймаут для обработки отказов отказа соединения.