2011-03-24 18 views
13

Estoy haciendo algunas solicitudes GET a una aplicación de App Engine, probando en Chrome. Aunque puedo ver en la consola de JavaScript que algunas llamadas dan como resultado un error de 500 servidores, parece que no puedo encontrar la forma de capturar este error en mi código jQuery a pesar de haber leído varios hilos SO similares. Entiendo que indica un error del lado del servidor, pero aún me gustaría poder capturar un error de mi javascript.jquery ajax ignora el error de estado 500

Necesito capturar el error para poder contar el número de respuestas (satisfactorias o no) y activar otra función cuando se hayan recibido todas las respuestas de llamada.

Chrome salida de la consola:

GET http://myapp.com/api?callback=jQuery12345&params=restOfParams 500 (Internal Server Error) 

Mi llamado:

function makeCall() { 
    var count = 0; 
    var alldata = $('#inputset').val(); 
    var rows = alldata.split('\n'); 
    var countmatch = rows.length; 
    for (i=0;i<rows.length;i++) { 
     data["param"] = rows[i]["val"]; 
     $.ajax({ 
       url: apiUrl, 
       type: 'GET', 
       data: data, 
       dataType: 'jsonp', 
       error: function(){ 
        alert('Error loading document'); 
        count +=1; 
       }, 
       success: function(responseJson) { 
          count +=1; 
          var res = responseJson.results; 
          if (count == countmatch) { 
           allDoneCallback(res); 
          } 
         }, 
      }); 
    } 
} 

he probado algunos de los siguientes:
Adición:

statusCode: {500: function() {alert('err');}} 

a la llamada.

Usando:

$().ready(function(){ 
    $.ajaxSetup({ 
     error:function(x,e) { 
      if(x.status==500) { 
       alert('Internel Server Error.'); 
      } 
      } 
     }); 
    }); 

qué alguien tiene alguna sugerencia concerniente a cómo podría atrapar la respuesta 500?

Gracias Oli

ACTUALIZACIÓN:

Basándose en las respuestas, mi código jQuery parece ser correcta, pero por alguna razón que sólo coger ciertos 500 respuestas recibidas de mi aplicación. Posiblemente este sea un problema con la forma en que App Engine devuelve el error (no sé mucho sobre esto), o cómo jquery maneja los errores con jsonp; este punto se trata brevemente en el último párrafo del artículo this.

Lo hice funcionar usando jquery-isonp que capturó los 500 estados lanzados por la aplicación.

+0

¿No debería ser 'statusCode' en lugar de' status'? –

Respuesta

4

Parece que no está utilizando el enlace document.ready de jQuery correctamente. La versión $().ready(...) es más o menos obsoleta. Pruebe uno de estos en su lugar:

$(document).ready(function() { 
    $.ajaxSetup({ 
     error: function(x, e) { 
      if (x.status == 500) { 
       alert('Internel Server Error.'); 
      } 
     } 
    }); 
}); 

o the shorthand:

$(function() { 
    $.ajaxSetup({ 
     error: function(x, e) { 
      if (x.status == 500) { 
       alert('Internel Server Error.'); 
      } 
     } 
    }); 
}); 
+0

Hola Matt, Gracias por responderme. Probé ambas sugerencias, pero todavía no tuve suerte, desafortunadamente ... es extraño, me pregunto si la consola de Chrome está reconociendo el estado 500, ¿pero jquery no es por alguna razón? Estoy en Chrome 10.0.648.151, usando jquery 1.5.1. Voy a probar esto en FF ahora. – oli

+0

No veo nada incorrecto con su código: la devolución de llamada 'error' debería funcionar como está escrito. ¿Podría publicar un [SSCCE] (http://sscce.org/)? –

+0

Hola Matt, lamentablemente no puedo ahora mismo (la aplicación que estoy llamando está alojada internamente en una empresa); sin embargo, creo que he logrado aislar el problema un poco más: la aplicación [App Engine] (http://code.google.com/appengine/docs/python/tools/webapp/redirects.html) devuelve el 500 cuando golpea un error internamente (jquery no detecta esto); si uso su funcionalidad self.error (500), el jquery SÍ lo detecta. Por lo que puedo ver en el navegador, ambos regresan casi como lo mismo, por lo que todavía no entiendo por qué uno está identificado correctamente. – oli

1

resuelto el problema mediante la actualización jQuery 1.9.1 a 2.1.1 de - ahora se empezó a llamar .error() a la derecha en la respuesta del servidor (antes ignoraría la respuesta de 500 y esperaría a que se agote el tiempo de espera).

Limitación: jQuery 2.1.1 no es compatible con Internet Explorer 8 y por debajo (como la OMI no deberías)

1

tuve un problema similar, que estaba usando funciones de jQuery promesa de .done, .fail, .always, y si encuentro un error interno del servidor 500, no se activarán ninguna de las funciones (hecho, error, siempre, error). muy raro.

al final Agregué un tiempo de espera en las opciones .ajax, cuando llega al tiempo de espera arroja un error y también ejecuta el método .fail.

searchify.myAjaxSearchTerms = $.ajax({ 
         'url': url, 
         type: "GET", 
         'dataType': 'jsonp', 
         'jsonp': 'json.wrf', 
         'jsonpCallback': searchify.cbFunc, 
         timeout: 4000, //needed for 500 errors - will go to fail block on timeout 
         beforeSend: searchify.beforeSendAutocomplete 

        }); 
searchify.myAjaxSearchTerms.fail(function(XHR, status, error){ 
         searchify.clearForm(); 
         searchify.renderWarningForNoQuery('<div class="notify-bubble"><span class="icon" data-icon="8" aria-hidden="true"></span><span>Sorry. We had a problem performing that search...<br/>Please try again<br/>Enter a <strong>product name</strong>, <strong>catalogue number</strong> or <strong>keyword</strong></span></div>'); 
        }); 
Cuestiones relacionadas