2012-02-27 15 views
15

Sto utilizzando jQuery.ajax() per connettersi al servizio back-end. Ho configurato un gestore di errori() e un gestore statusCode(). Entrambi funzionano bene, ma quando viene attivato il gestore di statusCode viene generato anche il gestore degli errori (il gestore degli errori viene effettivamente attivato prima). Preferirei che ciò non accadesse. Suppongo che questo sia possibile senza dover hackerare il codice del gestore degli errori?jQuery ajax - evitando error() callback quando viene richiamata la richiamata statusCode()

Il mio codice simile a questa:

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

Così come posso evitare l'errore() cottura gestore quando il codice di stato HTTP è 401?

Grazie per il fastidio di leggere!

+2

mi chiedo se sarebbe valsa la richiesta del team di jQuery, per fare in modo quando si torna falso nei gestori 'StatusCode' sarebbe impedire l'evento ajax moltiplicazione fino al gestore di 'errore'. Sicuramente questo non richiederebbe molto sforzo, rendendo più semplice scrivere un'applicazione in cui tutte le richieste non autenticate hanno lo stesso gestore globale, ovvero: una funzione per restituire un utente alla schermata di accesso. –

+0

@JoshMc: buona idea! – David

risposta

6

Senza l'hacking jQuery.ajax, non si può. Per me, i metodi ajax di jQuery sono uno dei punti dolenti della libreria. Per una gestione più ragionevole delle richieste, ti consiglio di esaminare superagent o qualche altra libreria autonoma.

+0

Anche se non proprio quello che volevo sentire, immagino che questo sia il più vicino possibile a una risposta. Grazie. –

10

È possibile controllare facilmente il codice di stato all'interno della richiamata di errore. Il primo parametro deve essere XMLHttpRequest (o jqHXR depeding sulla tua versione di jQuery) oggetto. Controllare di conseguenza la proprietà 'status' per il codice di stato dell'errore.

E.g.

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

    } 
} 
+0

Sì, ma speravo di evitare di dover hackerare il gestore degli errori come menzionato nel post originale. Da quello che ho capito, questo non può essere fatto che mi sembra un po 'strano ... –

+0

@LeeFrancis, oh capisco cosa intendi. Non potresti semplicemente scrivere un wrapper che usa le chiamate $ .ajax. È quindi possibile specificare quali codici di stato si desidera sopprimere nel gestore degli errori?Io scrivo wrapper per tutte le mie chiamate ajax così posso fare qualsiasi tweaking in un posto. Solo un pensiero ... –

+0

Sì, è più o meno quello che ho fatto alla fine. Tuttavia, mi sento come se stessi sconfiggendo lo scopo di avere i gestori predefiniti della libreria disponibili (successo ecc.) Quando stai controllando i codici di stato manualmente comunque. –

2

Puoi provare a utilizzare ajaxSetup e beforeSend di modificare il gestore di errore di richiesta Ajax automaticamente:

$.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); 
     }; 
    } 
    } 
}); 

Nel mio caso questo funziona.

+0

Molto bello. Tuttavia, può essere fatto funzionare quando il gestore degli errori è impostato con 'fail()' sul differimento restituito da '$ .ajax'? – Francisc

+0

Non ho provato, ma secondo l'ordine di esecuzione callback dell'oggetto jqXHR jQuery (errore prima di fallire, vedi http://api.jquery.com/jQuery.ajax/) puoi probabilmente modificare i callback differiti all'interno della funzione sostituendo il settings.error originale. – user2043553

5

Miglioramento delle soluzioni alternative precedenti che richiedono la codifica hard dei codici di stato per i quali non si desidera attivare il gestore di eventi generici.

A mio parere è più sicuro modificare il gestore degli errori poiché beforeSend potrebbe essere sovrascritto per altri scopi e pertanto è possibile attivare inavvertitamente il gestore di errori generico su tali chiamate. (Se qualcuno sovrascrive il callback di errore si aspetta che influenzi la gestione degli errori, se modificano il callback beforeSend non lo fanno).

Così si otterrebbe:

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

} 
+0

Questo è abbastanza intelligente. – Francisc

Problemi correlati