2012-02-27 18 views
15

Estoy usando jQuery.ajax() para conectarme a mi servicio de fondo. He configurado un controlador de error() y un controlador statusCode(). Ambos funcionan bien, pero cuando mi manejador de statusCode se dispara, el manejador de errores también se dispara (el manejador de errores se activa primero). Prefiero que esto no suceda. ¿Asumo que esto es posible sin tener que hackear el código del controlador de errores?jQuery ajax - evitando el error() devolución de llamada cuando callback statusCode() invocó

Mi código es como la siguiente:

$.ajax({ 
    ... 
    error: function(...) { 
     // process a general type of error here 
    }, 
    statusCode: { 
     401: function() { 
      // process a specific authentication failure 
     } 
    }     
}); 

Entonces, ¿cómo puedo evitar el error() de tiro manipulador cuando el código de estado HTTP es 401?

¡Gracias por molestarse en leer!

+2

Me pregunto si valdría la pena que solicita el equipo de jQuery, para que así cuando regrese falsa en los manipuladores 'statuscode' se evitaría el evento ajax propagar hasta el manejador de 'error' Seguramente esto no requeriría mucho esfuerzo, mientras que es más fácil escribir una aplicación donde todas las solicitudes no autenticadas tienen el mismo controlador global, es decir: una función para devolver a un usuario a la pantalla de inicio de sesión. –

+0

@JoshMc: ¡Buena idea! – David

Respuesta

6

Sin piratería jQuery.ajax, no se puede. Para mí, los métodos ajax de jQuery es uno de los puntos dolorosos de la biblioteca. Para un manejo más sensible de las solicitudes, le recomiendo que busque en superagent o en alguna otra biblioteca independiente.

+0

Aunque no es realmente lo que quería escuchar, creo que esto es lo más cercano que puedo a una respuesta. Gracias. –

10

Puede verificar fácilmente el código de estado dentro de la devolución de llamada por error. El primer parámetro debe ser XMLHttpRequest (o jqHXR depediendo en su versión de jQuery) objeto. Compruebe la propiedad 'estado' para el código de estado del identificador de error en consecuencia.

E.g.

error: function(a, b, c){ 
    if(a.status != 401){ 
    // handle other errors except authentication 

    } 
} 
+0

Sí, pero esperaba evitar tener que hackear el controlador de errores como mencioné en la publicación original. Por lo que entiendo, esto no se puede hacer, lo cual me parece un poco extraño ... –

+0

@LeeFrancis, oh entiendo a qué te refieres. ¿No podrías escribir un contenedor que usa las llamadas $ .ajax? ¿Podría entonces especificar qué códigos de estado desea suprimir en el controlador de errores?Escribo envoltorios para todas mis llamadas ajax, así que puedo hacer cualquier ajuste en un solo lugar. Solo un pensamiento ... –

+0

Sí, eso es más o menos lo que terminé haciendo al final. Sin embargo, siento que estoy derrotando el propósito de tener los manejadores predefinidos de la biblioteca disponibles (éxito, etc.) cuando se revisan los códigos de estado manualmente de todos modos. –

2

Usted puede intentar usar ajaxSetup y beforeSend para modificar el gestor de errores de su petición ajax automáticamente:

$.ajaxSetup({ 
    beforeSend: function(jqXHR, settings) { 
    if (typeof settings.error === 'function') { 
     var errorfunc = settings.error; 
     settings.error = function(jqXHR2, textStatus, errorThrown) { 
     if (jqXHR2.status !== 401) errorfunc(jqXHR2, textStatus, errorThrown); 
     }; 
    } 
    } 
}); 

En mi caso esto funciona.

+0

Muy bonito. Sin embargo, ¿se puede hacer que funcione cuando el manejador de errores se establece con 'fail()' en el diferido devuelto por '$ .ajax'? – Francisc

+0

No lo he intentado, pero de acuerdo con el orden de ejecución de devolución de llamada del objeto jQuery jqXHR (error antes de fallar, vea http://api.jquery.com/jQuery.ajax/) probablemente pueda modificar las devoluciones de llamada diferidas dentro de la función reemplazando el settings.error original. – user2043553

5

Mejorando las soluciones provisionales previas que requieren una codificación rigurosa de los códigos de estado para los cuales no desea activar el controlador genérico de eventos.

En mi opinión, es más seguro editar su controlador de errores ya que beforeSend podría sobrescribirse para algún otro fin y, por lo tanto, puede desencadenar inadvertidamente el controlador de error genérico en esas llamadas. (Si alguien sobrescribe la devolución de llamada de error esperan que afecte el manejo del error, si modifican la devolución de llamada beforeSend no lo hacen).

para que se consiga:

function ajaxError (jqXHR, textStatus, errorThrown) 
{ 
    if (jqXHR.status in this.statusCode) return; 
    // Handle generic events here. 

} 
+0

Esto es bastante inteligente. – Francisc

Cuestiones relacionadas