Проверьте состояние запроса jQuery ajax - PullRequest
9 голосов
/ 02 июля 2010

Кажется, что обратные вызовы success, error и complete запускаются, только когда ajax-запрос может получить какой-либо ответ от сервера.

Так что, если я выключаю сервер, следующий обратный вызов ошибки не выполняетсяи запрос молча завершается неудачей.

$.ajax({
  type: "GET",
  url: "http://localhost:3000/",
  dataType: "script",
  success: function() {
    alert("success");
  },
  error: function() {
    alert("error");
  }
});

Какой лучший способ выдать ошибку, когда сервер вообще не может быть достигнут.

Правка - Из того, что я пробовал и читалПохоже, что встроенная в JQuery обработка ошибок не работает с JSONP или dataType: «script».Поэтому я попытаюсь установить ручной тайм-аут.

Редактировать - провел немного больше исследований, и похоже, что не только обратный вызов ошибки ajax не работает, но вы не можете прервать запрос ajax с dataTypescript или jsonp, и эти запросы игнорируют настройку тайм-аута.

Есть альтернатива - плагин jquery-jsonp, но он использует скрытые фреймы, которых я бы предпочел избежать.Поэтому я остановился на создании ручного тайм-аута, как предложено ниже.Вы не можете прервать запрос, если он истек, что означает, что скрипт может все еще загружаться даже после истечения времени ожидания, но по крайней мере что-то сработает, если сервер недоступен.

Ответы [ 6 ]

8 голосов
/ 02 июля 2010

Вы можете использовать setTimeout и очистить его с помощью clearTimeout в полном обработчике.

var reqTimeout = setTimeout(function()
{
  alert("Request timed out.");
}, 5000);
var xhr = $.ajax({
  type: "GET",
  url: "http://localhost:3000/",
  dataType: "script",
  success: function() {
    alert("success");
  },
  error: function() {
    alert("error");        
  },
  complete: function() {
    clearTimeout(reqTimeout);
  }
});
5 голосов
/ 02 июля 2010

jQuery.ajax уже имеет предпочтение timeout, и оно должно вызвать ваш обработчик ошибок, если время ожидания истекло.Ознакомьтесь с фантастической документацией , в которой говорится - я бы процитировал это здесь, выделение мое:

timeoutNumber

Установите локальное время ожидания (в миллисекундах)для запроса…

и:

error (XMLHttpRequest, textStatus, errorThrown) Function

Функция, вызываемая в случае сбоя запроса.Функции передаются три аргумента: объект XMLHttpRequest, строка, описывающая тип возникшей ошибки и необязательный объект исключения, если таковой произошел.Возможные значения для второго аргумента (кроме нуля): "timeout" , "error", "notmodified" и "parsererror".Это Ajax Event.

2 голосов
/ 08 ноября 2017
error: function (jqXHR, textStatus, errorthrown) {
    if (jqXHR.readyState == 0) {
       //Network error, i.e.  server stopped, timeout, connection refused, CORS, etc.
    }
    else if (jqXHR.readyState == 4) {
       //HTTP error, i.e. 404 Not found, Internal Server 500, etc.
    }
}

Используйте readyState XMLHttpRequest, чтобы определить состояние запроса ajax.'readyState' содержит состояние XMLHttpRequest.

  • 0: запрос не инициализирован
  • 1: соединение с сервером установлено
  • 2: запрос получен
  • 3: обработка запроса
  • 4: запрос завершен и ответ готов
0 голосов
/ 02 июля 2010

в ie8, можно использовать:

  success: function(data, textStatus, XMLHttpRequest) {
    if("success"==textStatus&&XMLHttpRequest){
        alert("success");
    }else{
        alert("server down");
    }
  }

, но это не может работать на Chrome, Firefox ... я пытался

0 голосов
/ 02 июля 2010

Вы можете использовать Jquery AjaxSetup для обработки вашей ошибки.

   $.ajax({
    type: "GET",
    url: "http://localhost:3000/",
    dataType: "script",
    success: function () {
        alert("success");
    }, error: function () {
        alert("error");
    }
    //AJAX SETUP "error"//
    $.ajaxSetup({
        "error": function (XMLHttpRequest, textStatus, errorThrown) {
            alert(XMLHttpRequest + ' ' + textStatus + ' ' + errorThrown); //however you want
        }
    });
0 голосов
/ 02 июля 2010

Если я правильно помню, jQuery выдает исключения. Таким образом, вы должны иметь возможность работать с try { ... } catch() { ... } и обрабатывать его там.

...