Come si rileva un errore di post della query Ajax?


209

Vorrei rilevare l'errore e mostrare il messaggio appropriato se la richiesta Ajax fallisce.

Il mio codice è simile al seguente, ma non sono riuscito a catturare la richiesta Ajax non riuscita.

function getAjaxData(id)
{
     $.post("status.ajax.php", {deviceId : id}, function(data){

        var tab1;

        if (data.length>0) {
            tab1 = data;
        }
        else {
            tab1 = "Error in Ajax";
        }

        return tab1;
    });
}

Ho scoperto che "Errore in Ajax" non viene mai eseguito quando la richiesta Ajax non è riuscita.

Come posso gestire l'errore Ajax e mostrare il messaggio appropriato se fallisce?

Risposte:


304

Da jQuery 1.5 è possibile utilizzare il meccanismo degli oggetti differiti:

$.post('some.php', {name: 'John'})
    .done(function(msg){  })
    .fail(function(xhr, status, error) {
        // error handling
    });

Un altro modo è usare .ajax:

$.ajax({
  type: "POST",
  url: "some.php",
  data: "name=John&location=Boston",
  success: function(msg){
        alert( "Data Saved: " + msg );
  },
  error: function(XMLHttpRequest, textStatus, errorThrown) {
     alert("some error");
  }
});

14
@Yuck $ .post può accettare un callback di errore utilizzando oggetti rinviati. Dai un'occhiata alla mia risposta qui sotto per un esempio.
Michael Venable,

2
Inoltre, il modo per renderlo $.ajaxpiù leggibile è usare un hash per il tuo data. Ad esempio:{ name : 'John', location: 'Boston' }
briangonzalez,

3
I callback di successo ed errore sopra riportati sono obsoleti a partire da jQuery 1.8 api.jquery.com/jQuery.post
Baldy,

@MichaelVeneble penso che tu possa usare$.post().error()
clintgh

288

jQuery 1.5 ha aggiunto oggetti differiti che lo gestiscono bene. Basta chiamare $.poste allegare tutti i gestori che desideri dopo la chiamata. Gli oggetti differiti consentono persino di collegare più gestori di errori e successi.

Esempio:

$.post('status.ajax.php', {deviceId: id})
    .done( function(msg) { ... } )
    .fail( function(xhr, textStatus, errorThrown) {
        alert(xhr.responseText);
    });

Prima di jQuery 1.8, la funzione doneera chiamata successe failveniva chiamata error.


3
+1 Molto bello, ma non impazzisce per la sintassi. Spero che venga unificato in una versione futura.
Yuck,

25
Questa dovrebbe essere la risposta accettata. La risposta attualmente accettata è "usa un metodo diverso"; questa risposta dice "ecco come far funzionare il tuo metodo". Quest'ultimo è generalmente preferito su SO. In realtà, questo dovrebbe essere incluso nella documentazione di $ .post !!!
Mark E. Haase,


A proposito c'è anche una responseJSONproprietà che è anche molto utile in caso di tipo ajax json.
Ivkremer,

91
$.ajax({
  type: 'POST',
  url: 'status.ajax.php',
  data: {
     deviceId: id
  },
  success: function(data){
     // your code from above
  },
  error: function(xhr, textStatus, error){
      console.log(xhr.statusText);
      console.log(textStatus);
      console.log(error);
  }
});

15
$.post('someUri', { }, 
  function(data){ doSomeStuff })
 .fail(function(error) { alert(error.responseJSON) });

5
Aggiungere un po 'più di spiegazioni qui aiuterebbe i futuri lettori.
Eric Brown,

13

Un modo semplice è implementare ajaxError :

Ogni volta che una richiesta Ajax si completa con un errore, jQuery attiva l'evento ajaxError. Tutti i gestori che sono stati registrati con il metodo .ajaxError () vengono eseguiti in questo momento.

Per esempio:

$('.log').ajaxError(function() {
  $(this).text('Triggered ajaxError handler.');
});

Suggerirei di leggere la documentazione di ajaxError . Fa più del semplice caso d'uso sopra dimostrato - principalmente il suo callback accetta una serie di parametri:

$('.log').ajaxError(function(e, xhr, settings, exception) {
  if (settings.url == 'ajax/missing.html') {
    $(this).text('Triggered ajaxError handler.');
  }
});

1
+1 - Aggiungo che questo gestore ottiene diversi argomenti, in modo da poter visualizzare l'errore effettivo, il codice di risposta, l'URL, ecc.
Nick Craver

Si noti che a partire da jQuery 1.8, il metodo .ajaxError () deve essere allegato solo al documento.
Nanki,

0

Devi registrare il responseText:

$.ajax({
    type: 'POST',
    url: 'status.ajax.php',
    data: {
    deviceId: id
  }
})
.done(
 function (data) {
  //your code
 }
)
.fail(function (data) {
      console.log( "Ajax failed: " + data['responseText'] );
})

0

si collega il gestore .onerror all'oggetto ajax, perché le persone insistono nel pubblicare JQuery per le risposte quando vanila lavora su piattaforme diverse ...

esempio di sveltina:

ajax = new XMLHttpRequest();
ajax.open( "POST", "/url/to/handler.php", true );
ajax.onerror = function(){
    alert("Oops! Something went wrong...");
}
ajax.send(someWebFormToken );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.