2010-12-08 15 views
9

Tengo un controlador de errores ajax global que se ejecuta aunque el xhr.status es 200, xhr.statusText es "OK" y xhr.responseText es mi cadena JSON. Esto sucede en Firefox y IE.

$.ajax({ 
    data: { 
     method: "getRequestDetails", 
     loggedInUsername: loggedInUsername, 
     search: search 
    }, 
    success: function(data){ 
     var arrayObject = eval("(" + data + ")")['DATA']; 
     if (arrayObject.length == 0){ 
      alert("That search term returned no results"); 
     } else { 
      callBeforeShow("Results"); 
      $.each(arrayObject, function(index, value){ 
       showJSON(value, "Results"); 
      }); 
      callAfterShow("Results"); 
     } 
    } 
}); 

$(document).ajaxError(function(event, XMLHttpRequest, ajaxOptions, thrownError){ 
    var errorMessage = "Ajax Error\n"; 
    errorMessage += "Type: " + ajaxOptions.type + "\n"; 
    errorMessage += "Requesting Page: " + ajaxOptions.url + "\n"; 
    errorMessage += "Status: " + XMLHttpRequest.status + " - " + XMLHttpRequest.statusText + "\n"; 
    errorMessage += "Error Thrown: " + thrownError 
    alert(errorMessage); 
}); 

En IE esto dice que el XMLHttpRequest no está listo y en Firefox esto devuelve

"AJAX error" "Tipo: Enviar" "Solicitud Página: something.CFC" "Estado: 200 - OK" "se genera un error: no definido"

Así que mi solución es utilizar

$(document).ajaxComplete(function(event, XMLHttpRequest, ajaxOptions, errorThrown){ 
    if (XMLHttpRequest.status != 200){ 
     var errorMessage = "Ajax Error\n"; 
     errorMessage += "Type: " + ajaxOptions.type + "\n"; 
     errorMessage += "Requesting Page: " + ajaxOptions.url + "\n"; 
     errorMessage += "Status: " + XMLHttpRequest.status + " - " + XMLHttpRequest.statusText; 
     alert(errorMessage); 
    } 
}); 

EDIT * Esto solo ocurre en algunas ocasiones. La mayoría de las veces funciona, pero a veces se ejecuta $ .ajaxError() * eidt

{"COLUMNS":["ID","SUMMARY_SPEC","TOTAL_EFFORT","EFFORT_HISTORY","LOG_HISTORY"],"DATA":[[816,"test only","2 Minutes - Last Updated: 09\/12\/2010",{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","EFFORT_DATE","EFFORT_DAYS","EFFORT_HRS","EFFORT_MINS","EFFORT_TOT_HRS"],"DATA":[[816,496,"ruhlet","Tim Ruhle","December, 09 2010 00:00:00",0,0,1,0.0167],[816,497,"ruhlet","Tim Ruhle","December, 08 2010 00:00:00",0,0,1,0.0167]]},{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","LOG_DT","LOG_ENTRY"],"DATA":[]}]]}{"COLUMNS":["ID","SUMMARY_SPEC","TOTAL_EFFORT","EFFORT_HISTORY","LOG_HISTORY"],"DATA":[[816,"test only","2 Minutes - Last Updated: 09\/12\/2010",{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","EFFORT_DATE","EFFORT_DAYS","EFFORT_HRS","EFFORT_MINS","EFFORT_TOT_HRS"],"DATA":[[816,496,"ruhlet","Tim Ruhle","December, 09 2010 00:00:00",0,0,1,0.0167],[816,497,"ruhlet","Tim Ruhle","December, 08 2010 00:00:00",0,0,1,0.0167]]},{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","LOG_DT","LOG_ENTRY"],"DATA":[]}]]}{"COLUMNS":["ID","SUMMARY_SPEC","TOTAL_EFFORT","EFFORT_HISTORY","LOG_HISTORY"],"DATA":[[816,"test only","2 Minutes - Last Updated: 09\/12\/2010",{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","EFFORT_DATE","EFFORT_DAYS","EFFORT_HRS","EFFORT_MINS","EFFORT_TOT_HRS"],"DATA":[[816,496,"ruhlet","Tim Ruhle","December, 09 2010 00:00:00",0,0,1,0.0167],[816,497,"ruhlet","Tim Ruhle","December, 08 2010 00:00:00",0,0,1,0.0167]]},{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","LOG_DT","LOG_ENTRY"],"DATA":[]}]]} 

La última versión del quemador, lo reconoce como JSON.

Respuesta

1

ah, bien después de días de búsqueda comenté diferentes configuraciones en $ .ajaxSetup(). Terminó siendo que había establecido un tiempo de espera. Si solo hubiera un mejor mensaje de error. Gracias por toda la ayuda chicos, no habría llegado aquí si no fuera por ti. Todos ustedes obtienen votos!

+0

¿Has averiguado por qué un tiempo de espera provocó esto? ¿Te quedaste con tu controlador ajaxComplete original o encontraste un método más elegante? También estoy teniendo este problema y no lo entiendo. – CarlG

+0

No, no lo descubrí. Ya estaba retrasado tratando de arreglarlo, así que solo acepté que funcionó y que probablemente nunca sabría por qué. Lo siento –

3

¿Podría ser porque no le está diciendo al $.ajax que espera que JSON vuelva del servidor? Intente configurar la opción dataType a 'json':

$.ajax({ 
    dataType: 'json', 
    data: { ... 
+0

tengo como 10 otras llamadas ajax en la página, algunas usan plain y otras usan json y funcionan bien sin esa declaración. Pero lo intentaré de cualquier manera. –

+0

Ahora firebug está haciendo esto. excepción no detectada: [Excepción ... "Código de error devuelto por el componente: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.status]" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" ubicación: "JS frame :: myUrl.js :: anonymous :: línea 146" datos: no]. La línea 146 es la línea 4 en $.ajaxError() –

5

En primer lugar, me gustaría recomendar altamente abandonando la parte eval a favor del uso $ .parseJson o la opción dataType:'json' ajax que se encarga de automatizar el análisis sintáctico (por razones de rendimiento y seguridad, entre otras cosas). Si continúas usando eval, al menos envuélvelo como una trampa de prueba.

No estoy del todo seguro de todos los casos donde se llama ajaxError pero sospecho (basado en la "aleatoriedad" del error) que tiene que ver con un error dentro de la función de éxito (como llamar a eval javascript no válido que está recibiendo en su respuesta). Esto explicaría por qué se llama incluso cuando hay una respuesta de 200.

tldr: Obtenga eval de esa success devolución de llamada y afirme que sus respuestas son de hecho json válidas cuando se produce este error.

+0

Esto está en una intranet de trabajo. Estamos usando jQuery 1.3.2 y podría ser una gran molestia intentar obtener la última versión (que es necesaria para $ .parseJson(). Y no pude usar el javascript JSON.parse() ni lo que sea porque estamos utilizando IE7 que no admite el objeto JSON. El error se ejecuta antes de la evaluación de todos modos. –

+6

Puede utilizar la biblioteca Douglas Crockfords JSON: http://www.json.org/js.html. – jthompson

+1

Cuando obtiene el error, ¿puede incluir la respuesta JSON que recibe? Debido a la naturaleza aleatoria y los errores que describe, sospecho que tiene algo que ver con la respuesta real que se envía. También la opción dataType: 'json' está disponible en jQuery 1.3. 2. Yo recomendaría usarlo. – nategood

Cuestiones relacionadas