función de error jQuery ajax

130

Tengo una llamada ajax que pasa datos a una página que luego devuelve un valor.

He recuperado la llamada exitosa de la página pero la he codificado para que genere un error en el asp. ¿Cómo recupero ese error de jquery?

Por ejemplo:

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 el bit de error que no entiendo. En la función, ¿qué parámetro debo poner, para poder usar el mensaje de error que he generado en el servidor?

Darryl Wilson
fuente
Hay un error tipográfico existe: es dataTypeno datatype.
Alejandro Nava
Además, jQuery dice que no puede usar tanto el éxito como el error , tal como lo hizo.
Alejandro Nava
77
@ alej27: la redacción es un poco extraña, pero no dice que no puede usarlos a ambos, dice que una solicitud no llamará a éxito y error (porque son mutuamente excluyentes).
Marty Vance
Tenga cuidado con las respuestas aquí. A partir de jQuery 3.0, las versiones obsoletas se anotan .errory se .successvuelven más importantes a medida que se eliminan.
Mark Schultheiss

Respuestas:

222

Los parámetros requeridos en una errorfunción Ajax son jqXHR, exceptiony puede usarlo como a continuación:

$.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);
    },
});

FIDDLE DEMO


Parámetros

jqXHR:

En realidad es un objeto de error que se ve así

Error de Ajax jqXHR objeto

También puede ver esto en su propia consola del navegador, utilizando console.logdentro de la errorfunción como:

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

Estamos utilizando la statuspropiedad de este objeto para obtener el código de error, como si obtenemos status = 404, esto significa que no se pudo encontrar la página solicitada. No existe en absoluto. Según ese código de estado, podemos redirigir a los usuarios a la página de inicio de sesión o lo que sea que requiera nuestra lógica empresarial.

excepción:

Esta es una variable de cadena que muestra el tipo de excepción. Entonces, si estamos obteniendo un error 404, el exceptiontexto sería simplemente 'error'. Del mismo modo, podríamos obtener 'tiempo de espera', 'abortar' como otros textos de excepción.


Deprecation Aviso: El jqXHR.success(), jqXHR.error()y jqXHR.complete()devoluciones de llamada están en desuso a partir de jQuery 1.8. Para preparar el código para su eventual eliminación, usar jqXHR.done(), jqXHR.fail()y jqXHR.always()en su lugar.

Entonces, en caso de que esté utilizando jQuery 1.8 o superior , necesitaremos actualizar la lógica de la función de éxito y error como: -

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

¡Espero eso ayude!

palarse
fuente
66
Curiosamente, no se recomienda usar ajaxSetup. Ver api.jquery.com/jquery.ajaxsetup
SleepyBoBos
1
@ palaѕн Creo que leíste mal el aviso de desaprobación. Si observa, el aviso de desaprobación está hablando de una desaprobación de los métodos de jqXHR, pero el uso de éxito, error y completo en su ejemplo anterior se realiza dentro de un objeto al método $ .ajax. Esto no ha quedado en desuso y no necesita cambiar su código. Sin embargo, si uno prefiere encadenar los métodos, entonces podría usar este estilo. Cuando leí "desaprobación ..." esto me desconcertó (sin ninguna razón). :-)
bchr02
A partir de jQuery 3.0, los obsoletos se notan .errory se .successvuelven más importantes a medida que se eliminan
Mark Schultheiss
99

Prueba esto:

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

Si desea informar a su interfaz sobre un error de validación, intente devolver json:

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

Su script asp debería volver:

{"error": true}
czerasz
fuente
1
¿Para qué sirve textSttaus y errorThrown? ¿Puede explicar?
Annapurna
4

Aquí es cómo sacar el error 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.');
                  }
              }
Rico c
fuente
2
error(jqXHR, textStatus, errorThrown)

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

Praveen Prasad
fuente
9
Proporcione alguna explicación, no solo un fragmento de código y un enlace de documentos.
Greg Dubicki
12
Gracias por casi nada.
judasane
por ejemplo, podría haber dicho "OP está usando un error de función (error) pero jquery está llamando a un error de función (jqXHR, textStatus, errorThrown). Observe los 2 parámetros que faltan en el fragmento de OP".
increddibelly
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
fuente
2

estás usando una función

error(error) 

pero jquery está buscando una función con tres parámetros:

error(jqXHR, textStatus, errorThrown)

necesitará agregar dos parámetros más.

TAMBIÉN: echa un vistazo a todos los comentarios anteriores que mencionan 'obsoleto' :)

$.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
});
increddibelly
fuente
44
necesitará agregar dos parámetros más , esto está muy mal.
Desarrollador
1
hmm si eso es todo lo que tienes que decir, ¿tal vez no digas nada? o, PODRÍAS explicar tu declaración y realmente ayudar. Tu elección.
increddibelly
1
En JavaScript, digamos que tiene un método, function myMethod (err) { alert(err); }y luego llámelo como myMethod ("something is wrong", 500, some_object): Esto funcionará sin ningún problema. Según su declaración, esto solo funcionaría si la firma del método es function myMethod (err, status, some_object). Olvídate del ejemplo anterior, la firma del successevento que tienes en la respuesta es en realidad .success(data, status, xhr), pero si solo necesitas el resultado, generalmente lo vinculamos como.success (data) y ambos funcionan.
Desarrollador
¿Y qué valor agregado aportaste al agregar esta respuesta? En mi opinión, no hay ninguna información en su respuesta que faltaba en las respuestas anteriores. Lo único que hiciste fue levantar esta pregunta de nuevo en la pila.
Desarrollador
0

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

Si desea controladores globales, puede usar:

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