jQuery Ajax-Fehlerfunktion

130

Ich habe einen Ajax-Aufruf, der Daten an eine Seite weiterleitet, die dann einen Wert zurückgibt.

Ich habe den erfolgreichen Aufruf von der Seite abgerufen, aber ich habe ihn so codiert, dass er einen Fehler im Asp auslöst. Wie rufe ich diesen Fehler aus der Abfrage ab?

Beispielsweise:

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));**
}

Es ist das Fehlerbit, das ich nicht verstehe. In der Funktion , welche Parameter muss ich setzen, so dass ich dann die Fehlermeldung verwenden können , dass ich angehoben in den Server.

Darryl Wilson
quelle
Da ist ein Tippfehler: Es ist dataTypenicht datatype.
Alejandro Nava
Außerdem sagt jQuery, dass Sie nicht wie Sie sowohl Erfolg als auch Fehler verwenden können.
Alejandro Nava
7
@ alej27: Der Wortlaut ist seltsam, aber es heißt nicht, dass Sie nicht beide verwenden können. Eine Anfrage besagt nicht, dass Erfolg und Fehler auftreten (da sie sich gegenseitig ausschließen).
Marty Vance
Gehen Sie hier vorsichtig mit Antworten um. Ab jQuery 3.0 werden die veralteten vermerkt .errorund .successwerden wichtiger, wenn sie entfernt wurden.
Mark Schultheiss

Antworten:

221

Die erforderlichen Parameter in einer Ajax- errorFunktion sind jqXHR, exceptionund Sie können sie wie folgt verwenden:

$.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


Parameter

jqXHR:

Es ist eigentlich ein Fehlerobjekt, das so aussieht

Ajax-Fehler jqXHR-Objekt

Sie können dies auch in Ihrer eigenen Browserkonsole anzeigen, indem Sie console.logdie folgenden errorFunktionen verwenden:

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

Wir verwenden die statusEigenschaft dieses Objekts, um den Fehlercode abzurufen. Wenn wir beispielsweise status = 404 erhalten, bedeutet dies, dass die angeforderte Seite nicht gefunden wurde. Es existiert überhaupt nicht. Basierend auf diesem Statuscode können wir Benutzer auf die Anmeldeseite oder was auch immer unsere Geschäftslogik erfordert, umleiten.

Ausnahme:

Dies ist eine Zeichenfolgenvariable, die den Ausnahmetyp anzeigt. Wenn wir also einen 404-Fehler erhalten, exceptionwäre Text einfach "Fehler". In ähnlicher Weise können wir als andere Ausnahmetexte "Timeout" und "Abbruch" erhalten.


Deprecation Hinweis: Die jqXHR.success(), jqXHR.error()und jqXHR.complete()Rückrufe werden als von jQuery 1.8 veraltet. Um den Code für ihre spätere Entfernung vorzubereiten, verwendet jqXHR.done(), jqXHR.fail()und jqXHR.always()stattdessen.

Wenn Sie also jQuery 1.8 oder höher verwenden, müssen wir die Erfolgs- und Fehlerfunktionslogik wie folgt aktualisieren:

// 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");
    });

Ich hoffe es hilft!

palaSн
quelle
6
Interessanterweise wird die Verwendung von ajaxSetup nicht empfohlen. Siehe api.jquery.com/jquery.ajaxsetup
SleepyBoBos
1
@ palaSн Ich denke, Sie haben den Verfallshinweis falsch verstanden. Wenn Sie bemerken, dass es sich bei der Verfallsbenachrichtigung um eine Verwerfung von Methoden von jqXHR handelt, die Verwendung von Erfolg, Fehler und Vollständigkeit in Ihrem obigen Beispiel jedoch innerhalb eines Objekts der $ .ajax-Methode erfolgt. Dies ist nicht veraltet und Sie müssen Ihren Code nicht wechseln. Wenn Sie die Methoden jedoch lieber verketten möchten, können Sie diesen Stil verwenden. Wenn ich "Abwertung ..." las, warf mich das ab (ohne Grund). :-)
bchr02
Ab jQuery 3.0 werden die veralteten vermerkt .errorund .successwichtiger, da sie entfernt wurden
Mark Schultheiss
99

Versuche dies:

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

Wenn Sie Ihr Frontend über einen Validierungsfehler informieren möchten, versuchen Sie, json zurückzugeben:

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

Ihr Asp-Skript sollte Folgendes zurückgeben:

{"error": true}
czerasz
quelle
1
Wofür ist textSttaus und errorThrown? Können Sie bitte erklären
Annapurna
4

So ziehen Sie den Asp-Fehler heraus.

              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.');
                  }
              }
Rich C.
quelle
2
error(jqXHR, textStatus, errorThrown)

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

Praveen Prasad
quelle
9
Bitte geben Sie eine Erklärung, nicht nur einen Code und einen Link für Dokumente.
Greg Dubicki
12
Danke für fast nichts.
Judasane
Zum Beispiel hätten Sie sagen können: "OP verwendet einen Funktionsfehler (error), aber jquery ruft einen Funktionsfehler auf (jqXHR, textStatus, errorThrown). Beachten Sie die 2 fehlenden Parameter im OP-Snippet."
Unglaublich
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);
          }
sT0n3
quelle
2

Sie verwenden eine Funktion

error(error) 

Aber jquery sucht tatsächlich nach einer Funktion mit drei Parametern:

error(jqXHR, textStatus, errorThrown)

Sie müssen zwei weitere Parameter hinzufügen.

AUCH: Bitte schauen Sie sich alle Kommentare oben an, in denen "veraltet" erwähnt wird :)

$.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
});
ungläubig
quelle
4
Sie müssen zwei weitere Parameter hinzufügen - das ist so falsch.
Entwickler
1
hmm. wenn das alles ist, was du zu sagen hast - vielleicht nichts zu sagen? oder Sie KÖNNTEN Ihre Aussage erklären und tatsächlich helfen. Deine Entscheidung.
ungläubig
1
Angenommen, Sie haben in JavaScript eine Methode - function myMethod (err) { alert(err); }und nennen Sie sie dann wie myMethod ("something is wrong", 500, some_object)folgt -. Dies funktioniert ohne Probleme. Laut Ihrer Aussage würde dies nur funktionieren, wenn die Methodensignatur lautet function myMethod (err, status, some_object). Vergessen Sie das obige Beispiel, die Signatur des successEreignisses, das Sie in der Antwort haben, ist tatsächlich .success(data, status, xhr), aber wenn Sie nur das Ergebnis benötigen, binden wir es normalerweise wie .success (data)und beide funktionieren.
Entwickler
Und welchen Mehrwert haben Sie durch das Hinzufügen dieser Antwort gebracht? IMO enthält Ihre Antwort keine Informationen, die in den vorherigen Antworten fehlten. Sie haben diese Frage nur noch einmal in den Stapel gezogen.
Entwickler
0

Von 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.

Wenn Sie globale Handler möchten, können Sie Folgendes verwenden:

.ajaxStart(), .ajaxStop(),
.ajaxComplete(), .ajaxError(),
.ajaxSuccess(), .ajaxSend()
John Kloian
quelle