2010-09-04 34 views
33

Necesito algunas sugerencias aquí o tal vez algunas explicaciones. Tengo una llamada jquery ajax,Jquery ajax error callback

$.ajax({ 
type: "GET", 
url: base_url+'/ajax/fetch/counts/', 
dataType: 'json', 
data: {}, 
error: function(xhr, error){ 
     console.debug(xhr); console.debug(error); 
}, 
success: display_counts 
}); 

Está funcionando bien. Mi devolución de llamada success se activa correctamente con la respuesta. Sin embargo, lo que he notado es que mi error devolución de llamada se dispara cada vez, incluso cuando mi llamada devuelve estado de éxito 200. En el error devolución de llamada más arriba, veo que es objeto xhr.status 200.

¿Alguien puede explicar lo que está mal, o lo está sucediendo aquí? Se supone que la devolución de llamada error solo se activará cuando tenga 404 o una respuesta que no sea 200. ¿Son mis suposiciones correctas?

Gracias.

Respuesta

24

de devolución de llamada de error se llama en los errores HTTP, sino también si JSON análisis de la respuesta no. Esto es lo que probablemente está sucediendo si el código de respuesta es 200, pero aún se lanza a la devolución de llamada por error.

+2

Si está esperando una respuesta no JSON. Puede establecer la opción dataType en secuencia de comandos/texto ... etc. Visite http://api.jquery.com/jQuery.ajax y busque en el filtro de datos para obtener más información. – thekindofme

+0

Estaba llamando a un script cgi, lo necesitaba para volcar los datos en formato json. Estaba devolviendo una cadena que falló. – NuclearPeon

1

A recent question tenía un problema similar con json solicitudes de jquery, intente eliminar el entorno () de su respuesta json.

+0

divertido, he tenido un problema similar que se fija mediante la adición * * Las fijaciones de los alrededores. –

+0

@Coronatus Sí, esto es lo que solía hacer, pero jquery 1.4.2 comienza a confiar en 'JSON.parse' del navegador,' JSON.parse' de mi Firefox analizará '{" clave ":" valor "}' con éxito , pero emita un error en '({" clave ":" valor "})'. – aularon

+0

Para evitar las diferencias entre los navegadores al analizar JSON, recomendaría utilizar el analizador de Douglas Crockford: http://www.json.org/json2.js –

2

Un par de cosas que se me ocurren:

  1. Asegúrese de que tiene el almacenamiento en caché desactivada mediante el establecimiento de cache: false.
  2. Si está utilizando Firefox, intente utilizar Firebug y la pestaña de red para supervisar la solicitud
  3. No confíe en el analizador JSON del navegador. Yo recomendaría este: https://github.com/douglascrockford/JSON-js/blob/master/json2.js del creador de JSON no menos
+1

"trivial y obvio" - bueno, eso fue simplemente duro. :) –

+0

Bien, lo siento si eso fue realmente duro. +1 ya para referirse a lo del analizador JSON. :) – simplyharsh

+0

solo bromeando, no hay problema –

1

No soy un experto en jQuery, pero sé que bwith Prototype.js, los incendios gestor de errores de AJAX si la petición tiene éxito pero el success controlador causa un error. ¿Es lo mismo en jQuery? Puede probar si esto es lo que está sucediendo colocando todo el contenido de display_counts en un try..catch block.

28

Sólo una sugerencia, intente utilizar el $.ajaxSetup() para obtener el error correcto de esta manera:

$(function() { 
    $.ajaxSetup({ 
     error: function(jqXHR, exception) { 
      if (jqXHR.status === 0) { 
       alert('Not connect.\n Verify Network.'); 
      } else if (jqXHR.status == 404) { 
       alert('Requested page not found. [404]'); 
      } else if (jqXHR.status == 500) { 
       alert('Internal Server Error [500].'); 
      } else if (exception === 'parsererror') { 
       alert('Requested JSON parse failed.'); 
      } else if (exception === 'timeout') { 
       alert('Time out error.'); 
      } else if (exception === 'abort') { 
       alert('Ajax request aborted.'); 
      } else { 
       alert('Uncaught Error.\n' + jqXHR.responseText); 
      } 
     } 
    }); 
}); 
+1

Solo como un aparte, [el estado de Docs] (https://api.jquery.com/jquery.ajaxsetup /): * Nota: las funciones de devolución de llamada global se deben establecer con sus respectivos métodos de gestión de eventos Ajax globales-.ajaxStart(), .ajaxStop(), .ajaxComplete(), .ajaxError(), .ajaxSuccess(), .ajaxSend () - en lugar de dentro del objeto de opciones para $ .ajaxSetup(). * Por lo que parece que esto sería mejor utilizado en ['.ajaxError()'] (https://api.jquery.com/ajaxError/) – DelightedD0D

+1

Por lo tanto, una cosa importante para darse cuenta es que su ajax podría fallar en la computadora de un usuario si su conexión a Internet es irregular. Así que su aplicación podría estar funcionando bien, pero reciben solicitudes ajax fallidas debido a una mala conexión a Internet, que parece ser identificable por los casos 'status === 0' y' exception === 'timeout'' anteriores. –

+1

También tenga en cuenta que los documentos indican que: "Esto puede causar un comportamiento no deseado ya que otras personas que llaman (por ejemplo, complementos) pueden esperar la configuración predeterminada normal. Por ese motivo, * recomendamos encarecidamente no usar esta API. *" – eis

-1

Cambio dataTypeplain/text-html