Funzione di errore jQuery ajax


130

Ho una chiamata Ajax che passa i dati a una pagina che quindi restituisce un valore.

Ho recuperato la chiamata riuscita dalla pagina, ma l'ho codificata in modo da generare un errore nell'ASP. Come posso recuperare quell'errore dal jquery?

Per esempio:

cache: false,
url: "addInterview_Code.asp",
type: "POST",
datatype: "text",
data: strData,
success: function (html) {
    alert('successful : ' + html);
    $("#result").html("Successful");
},
error: function (error) {
    **alert('error; ' + eval(error));**
}

È il bit di errore che non capisco. Nella funzione quale parametro devo inserire, in modo da poter utilizzare il messaggio di errore che ho generato nel server.


C'è un errore di battitura lì: non lo dataTypeè datatype.
Alejandro Nava,


7
@ alej27: il testo è un po 'strano, ma non dice che non puoi usarli entrambi, dice che una richiesta non chiamerà successo ed errore (perché si escludono a vicenda).
Marty Vance,

Fare attenzione con le risposte qui come di jQuery 3.0 del deprecato notato su .errore .successdiventano più importanti in quanto sono stati rimossi.
Mark Schultheiss il

Risposte:


222

I parametri richiesti in una errorfunzione Ajax sono jqXHR, exceptione puoi usarlo come di seguito:

$.ajax({
    url: 'some_unknown_page.html',
    success: function (response) {
        $('#post').html(response.responseText);
    },
    error: function (jqXHR, exception) {
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    },
});

DEMO FIDDLE


parametri

jqXHR:

In realtà è un oggetto di errore che è simile a questo

Errore Ajax oggetto jqXHR

Puoi anche visualizzarlo nella tua console del browser, utilizzando console.logall'interno della errorfunzione come:

error: function (jqXHR, exception) {
    console.log(jqXHR);
    // Your error handling logic here..
}

Stiamo usando il status proprietà di questo oggetto per ottenere il codice di errore, come se ottenessimo status = 404 questo significa che non è stato possibile trovare la pagina richiesta. Non esiste affatto. In base a quel codice di stato, possiamo reindirizzare gli utenti alla pagina di accesso o qualunque cosa la nostra logica aziendale richieda.

eccezione:

Questa è una variabile stringa che mostra il tipo di eccezione. Quindi, se otteniamo un errore 404, il exceptiontesto sarebbe semplicemente "errore". Allo stesso modo, potremmo ottenere "timeout", "interrompere" come altri testi di eccezione.


Deprecazione Avviso: Il jqXHR.success(), jqXHR.error(), e jqXHR.complete()callback sono deprecati come di jQuery 1.8. Per preparare il codice per la loro eventuale rimozione, usare jqXHR.done(), jqXHR.fail()e jqXHR.always()invece.

Quindi, nel caso in cui si utilizzi jQuery 1.8 o versioni successive , sarà necessario aggiornare la logica della funzione di errore e di successo come: -

// Assign handlers immediately after making the request,
// and remember the jqXHR object for this request
var jqxhr = $.ajax("some_unknown_page.html")
    .done(function (response) {
        // success logic here
        $('#post').html(response.responseText);
    })
    .fail(function (jqXHR, exception) {
        // Our error logic here
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    })
    .always(function () {
        alert("complete");
    });

Spero che sia d'aiuto!


6
È interessante notare che non è consigliabile utilizzare ajaxSetup. Vedi api.jquery.com/jquery.ajaxsetup
SleepyBoBos

1
@ palaѕн Penso che tu abbia letto male l'avviso di ammortamento. Se noti, l'avviso di deprecazione parla di una deprecazione dei metodi di jqXHR, ma l'uso di successo, errore e completo nell'esempio sopra è fatto all'interno di un oggetto con il metodo $ .ajax. Questo non è stato deprecato e non è necessario cambiare il codice. Tuttavia, se si preferisce incatenare i metodi, è possibile utilizzare questo stile. Quando ho letto "deprecazione ..." questo mi ha buttato via (senza motivo). :-)
bchr02

A partire da jQuery 3.0 i deprecati hanno notato .errore .successdiventano più importanti man mano che sono stati rimossi
Mark Schultheiss,

99

Prova questo:

error: function(jqXHR, textStatus, errorThrown) {
  console.log(textStatus, errorThrown);
}

Se vuoi informare il tuo frontend di un errore di convalida, prova a restituire json:

dataType: 'json',
success: function(data, textStatus, jqXHR) {
   console.log(data.error);
}

Il tuo script ASP potrebbe tornare:

{"error": true}

1
A cosa serve textSttaus ed errorThrown? Potete per favore spiegare
Annapurna il

4

Ecco come estrarre l'errore asp.

              cache: false,
              url: "addInterview_Code.asp",
              type: "POST",
              datatype: "text",
              data: strData,
              success: function (html) {
                  alert('successful : ' + html);
                  $("#result").html("Successful");
              },
              error: function (jqXHR, textStatus, errorThrown) {
                  if (jqXHR.status == 500) {
                      alert('Internal error: ' + jqXHR.responseText);
                  } else {
                      alert('Unexpected error.');
                  }
              }

2
error(jqXHR, textStatus, errorThrown)

http://api.jquery.com/jQuery.ajax/


9
Si prega di fornire alcune spiegazioni, non solo un pezzo di codice e un collegamento per la documentazione.
Greg Dubicki,

12
Grazie per quasi nulla.
Judasane,

per esempio, avresti potuto dire "OP utilizza un errore di funzione (errore) ma jquery sta chiamando un errore di funzione (jqXHR, textStatus, errorThrown). Nota i 2 parametri mancanti nello snippet di OP."
incredibilmente

2
          cache: false,
          url: "addInterview_Code.asp",
          type: "POST",
          datatype: "text",
          data: strData,
          success: function (html) {
              alert('successful : ' + html);
              $("#result").html("Successful");
          },
          error: function(data, errorThrown)
          {
              alert('request failed :'+errorThrown);
          }

2

stai usando una funzione

error(error) 

ma jquery sta effettivamente cercando una funzione con tre parametri:

error(jqXHR, textStatus, errorThrown)

dovrai aggiungere altri due parametri.

ANCHE: per favore dai un'occhiata a tutti i commenti sopra che menzionano 'deprecato' :)

$.ajax("www.stackoverflow.com/api/whatever", {
    dataType:"JSON"
    data: { id=1, name='example' }
}).succes(function (result) {
    // use result
}).error(function (jqXHR, textStatus, errorThrown) {
    // handle error
});

4
dovrai aggiungere altri due parametri : è così sbagliato.
Sviluppatore

1
hmm. se questo è tutto ciò che hai da dire - forse non dire niente? oppure POTREBBE spiegare la tua affermazione e aiutarti davvero. La tua scelta.
incredibilmente

1
In JavaScript, supponi di avere un metodo - function myMethod (err) { alert(err); }e quindi chiamalo come myMethod ("something is wrong", 500, some_object)- Funzionerà senza problemi. Secondo la tua affermazione, questo funzionerebbe solo se la firma del metodo è function myMethod (err, status, some_object). Dimentica l'esempio sopra, la firma successdell'evento che hai nella risposta è in realtà .success(data, status, xhr), ma se hai solo bisogno del risultato, di solito lo leghiamo come .success (data)ed entrambi funzionano.
Sviluppatore

E quale valore aggiunto hai aggiunto aggiungendo questa risposta? IMO non ci sono informazioni nella tua risposta che mancavano nelle risposte precedenti. L'unica cosa che hai fatto è stata sollevare di nuovo questa domanda nello stack.
Sviluppatore

0

Da jquery.com:

The jqXHR.success(), jqXHR.error(), and jqXHR.complete()
callback methods introduced injQuery 1.5 are deprecated
as of jQuery 1.8. To prepare your code for their eventual 
removal, use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.

Se vuoi gestori globali puoi usare:

.ajaxStart(), .ajaxStop(),
.ajaxComplete(), .ajaxError(),
.ajaxSuccess(), .ajaxSend()
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.