2011-08-09 27 views
5

Mi código es:¿Cómo debo depurar una solicitud jQuery Ajax?

var test = "it isn't working"; 
var response = $.ajax({ 
    type: 'GET', 
    url: 'jquerydemo.php', //This is in the same site as the page calling this request, so it's not a same-domain error. 
    success: function(){ 
      test = "it's working"; 
     }, 
    error: function(){ 
      alert("Error detected"); 
     } 
}).responseText; 
alert(test); 

He probado el código de estado y salió a un 200 y la función de error que nunca se apaga, pero tampoco lo hace la función de éxito. Como dije en mi comentario, no es un error de política de origen. Simplemente permanece diciendo "no está funcionando". ¿Que está pasando aqui?

Respuesta

5

Su llamada ajax es asincrónica. Todavía no se completó cuando se ejecuta su alerta al final. Ponga una alerta real en la función de éxito y debería ver su resultado allí.

Recuerde que realizar la llamada ajax solo inicia la llamada ajax asincrónica y luego el resto del código continúa ejecutándose. En el ejemplo de código que publicó, eso significa que su llamada alert(test) se ejecuta inmediatamente antes de que se complete la llamada ajax.

SOLO puede examinar los resultados de la llamada ajax desde el controlador de éxito.

var test = "it isn't working"; 
var response = $.ajax({ 
    type: 'GET', 
    url: 'jquerydemo.php', //This is in the same site as the page calling this request, so it's not a same-domain error. 
    success: function(){ 
      alert("it's working"); // put this here and you will see it 
            // if the ajax call is successful 
     }, 
    error: function(){ 
      alert("Error detected"); 
     } 
}).responseText; 
+0

Usted también tiene la opción de añadir 'asíncrono: true' a la configuración que pase en su' ajax' llamada, pero hay que tener en cuenta que esto va a parar todo ese hilo de ejecución en tu script hasta que la solicitud haya regresado. – dfreeman

+0

@SchiefGelaufen - Supongo que querías decir 'async: false'. Convertir la llamada ajax en una llamada síncrona es una opción, pero como bloquea toda la página web durante la llamada ajax, rara vez es la mejor opción de diseño. Es más complicado codificar con 'async: true', pero ofrece una mejor experiencia de usuario. – jfriend00

+0

Vaya, tonto error de mi parte. Sí, 'async: falso'. No es necesariamente cierto que realizar una solicitud ajax sincrónica bloquee toda la página (al menos, hay una serie de circunstancias bajo las cuales no), pero ciertamente se considera una mejor práctica poner cualquier lógica que dependa de la respuesta en su éxito. llamar de vuelta. – dfreeman

0

Puede que sea como

var response = $.ajax({ 
    type: 'GET', 
    url: 'jquerydemo.php', 
    success: function(){ 
      alert("it's working"); 
     }, 
    error: function(){ 
      alert("Error detected"); 
     } 
}).responseText; 

Esto funcionará ....

1

movimiento que alerta (prueba) de extremo en la función del éxito de la llamada AJAX. Si alerta significa que el código está funcionando, de lo contrario no es así. solo puede depurar la llamada ajax en su regreso exitoso.

var test = "it isn't working"; 
var response = $.ajax({ 
    type: 'GET', 
    url: 'jquerydemo.php', 
    success: function(){ 
      test = "it's working"; 
      alert(test); //It will alert when you ajax call returns successfully. 
     }, 
    error: function(){ 
      alert("Error detected"); 
     } 
}).responseText; 

Espero que esto ayude.

2

Para depurar este tipo de cosas, I find Firebug es una herramienta indispensable. Le mostrará exactamente la respuesta del servidor (error 500, error 553, qué tiene). Puede poner puntos de interrupción en su código Javascript y depurarlo paso a paso. Firebug funciona en Firefox.

Para IE, puede utilizar la función de Herramientas de desarrollador que es similar a Firebug, especialmente en IE9 que parece más maduro que las versiones anteriores de Developer Tools para IE7 o IE8.

+0

Para IE, también está Firebug Lite - http://getfirebug.com/firebuglite –

+0

También puede presionar CTRL-SHIFT-J en Chrome – pilavdzice

12

Prueba esto:

error: function(jqXHR, textStatus, errorThrown) { 
     console.log(JSON.stringify(jqXHR)); 
     console.log("AJAX error: " + textStatus + ' : ' + errorThrown); 
} 
Cuestiones relacionadas