2012-03-08 12 views
12

Vorrei rilevare le eccezioni generate dai callback passati a jQuery (a gestori di eventi come click o ai metodi jqXHR come then o always).Come catturare le eccezioni generate nei callback passati a jQuery?

Ho identificato due opzioni:

  • window.onerror gestore - questa è solo una soluzione parziale, perché non è supportato su Android, che è uno dei miei piattaforme di destinazione
  • gestione delle eccezioni all'interno di ogni singola richiamata - Non ASCIUTO affatto!

L'unica altra cosa che posso pensare è sovrascrivere i metodi jQuery ma che può causare problemi ogni volta che aggiorno jQuery. Per i gestori di AJAX, potrei usare $ .ajaxSetup (in base alla risposta allo Exceptions thrown in jQuery AJAX callbacks swallowed?) ma non sono sicuro che mi consentirà di catturare tutto.

Ci sono altre opzioni?

risposta

15

si può avvolgere ogni richiamata in questo modo:

function cbWrapper(fn) { 
    return function() { 
     try { 
      return(fn.apply(this, arguments)); 
     } catch(e) { 
      // handle all your exceptions here 
     } 
    }; 
} 

Così, quando si va a passare un callback per una chiamata AJAX, invece di passare la richiamata reale, si passa cbWrapper(callback).

$.get(url, cbWrapper(myRealCallback)); 

O la versione anonima in linea sarebbe stato così:

$.get(url, cbWrapper(function() { 
    // actual callback code here 
})); 

Un modo più avanzato di farlo sarebbe quello di ignorare $.get() con una propria implementazione che avvolge automaticamente la richiamata, ma che diventa difficile perché jQuery è così flessibile su quali argomenti vengono effettivamente passati. Per questo motivo e poiché è necessario sovrascrivere un argomento specifico per fare in modo che funzioni, è necessario duplicare tutti i relativi codici di rilevamento degli argomenti che determinano quali argomenti sono presenti e quali corrispondono ai parametri delle funzioni effettive. Quel codice è un po 'disordinato. È fattibile e probabilmente non si romperà perché se jQuery lo rompesse, il codice jQuery esistente si romperebbe, ma non è molto pulito.

Se è tutto il proprio codice, si può solo rendere la propria versione di $.get() che non è così flessibile con le posizioni di argomento e passare tutto il codice da utilizzare al posto del reale $.get():

jQuery.fn.myGet = function(url, fn) { 
    return(jQuery.get(url, cbWrapper(fn))); 
} 
Problemi correlati