Лучший способ проверить, был ли запрос AJAX успешным в jQuery

Я проверял, чтобы мои запросы AJAX были успешными, выполнив что-то вроде этого:

$.post("page.php", {data: stuff}, function(data, status) {
    if(status == "success") {
        //Code here
    }
    else {
        //Error handling stuff
    }
});

Проверяет ли переменная статуса лучший способ сделать это, или есть лучший способ убедиться, что запрос действительно прошел? Я рассматриваю "успешный" запрос как запрос, который попадает на страницу, которую я отправляю, чтобы успешно без тайм-аута (если сервер был выключен, и запрос AJAX был сделан до того, как он упал в качестве примера) или возвратил вид ошибки 404 или 500.

Ответы

Ответ 1

Вызывая $.post таким образом, вы автоматически передаете только функцию success handler.

Если что-то по запросу пошло не так, этот метод даже не выполняется.

Чтобы иметь больший контроль, используйте либо $.ajax() напрямую, либо передайте обработчики сбоев. Это может выглядеть как

$.post("page.php", {data: stuff}, function(data, status) {
   // we're fine here
}).fail(function(err, status) {
   // something went wrong, check err and status
});

То же самое с помощью .ajax():

$.ajax({
   type: 'POST',
   url: 'page.php',
   data: stuff,
   success: function( data ) {
   },
   error: function(xhr, status, error) {
      // check status && error
   },
   dataType: 'text'
});

Вы можете передать еще один обработчик событий ajax на $.ajax, например beforeSend, чтобы изменить/прочитать заголовки XHR или complete, чтобы иметь обработчик, который запускается в любом случае (ошибка или нет), когда запросы завершены.

Ответ 2

Я предпочитаю использовать вызов ajax, поскольку он имеет явный обработчик успеха

$.ajax({
url: "page.php",
data: stuff,
success: function(response){
console.log("success");
}
});

Я бы также рекомендовал использовать firebug или webkit, поэтому вы можете отслеживать запросы и проверять параметры!

Ответ 3

jQuery, конечно, считает "успешным" в том, как он находится в исходном коде. Это не включает код состояния 404/500 и ни один тайм-аут, так как в этом случае код статуса не был возвращен.

Вы можете проверить, когда именно он возвращает "success":

// If successful, handle type chaining
if ( status >= 200 && status < 300 || status === 304 ) {

...
    // If not modified
    if ( status === 304 ) {

        statusText = "notmodified";
...

    // If we have data
    } else {

        try {
...
            statusText = "success"; // So: only when status code is in
                                    // the range 200 <= x < 300
...
        } catch(e) {
...
            statusText = "parsererror";
...
        }
    }