2010-04-27 11 views
7

Gibt es eine Möglichkeit, Ausnahmen zu behandeln, die von AJAX-Callbacks in jQuery ausgelöst werden, außer dass jedem Callback ein try..catch-Block hinzugefügt wird? Die Fehlerfunktion wird in dieser Situation nicht aufgerufen.Exceptions geworfen in jQuery AJAX Callbacks geschluckt?

$.ajax(
{ 
    url: 'myurl.rails', 
    success: function(data) 
    { 
     throw 'Oh no!'; 
    }, 
    error: function (xhr, textStatus, errorThrown) 
    { 
     console.log('AJAX call failed', xhr, textStatus, errorThrown); 
    }    
}); 

Antwort

5

Wenn Sie sich die nicht-verkleinerte Version von jQuery 1.4.2 ansehen, sind die relevanten Zeilen 5264 bis 5274. jQuery ruft nur die success Funktion auf, die auf das Einstellungsobjekt angewendet wird (falls es existiert), ohne genau zu wissen, was Funktion kehrt zurück oder wirft.

Was Sie tun können, stattdessen ist jQuery.ajaxSetup() verwenden wie so:

jQuery.ajaxSetup({ 
    success: function() { 
     try { 
      if (this.mysuccess) { 
       this.mysuccess.apply(this, arguments); 
      } 
     } 
     catch(err) { 
      // whatever 
     } 
    } 
}); 

Und verwenden mysuccess (oder was auch immer Sie würden es vorziehen, es zu nennen) statt success an den einzelnen jQuery.ajax Anrufe.

+0

Ich bin neugierig, ob jemand weiß * warum * es ist egal, wenn eine Ausnahme geworfen wird: http://StackOverflow.com/Questions/11800349/Why-does-Jquery-Swallow-Exceptions-in-Ajax-Success- Rückrufe –

0

Haben Sie in eine der globalen AJAX-Features von jQuery wie ajaxSetup und ajaxError geschaut?

+1

Wie Justin erwähnt, ist der Fehler/ajaxError Callback für fehlgeschlagene Anfragen, nicht für Ausnahmen im Anwendungscode im Erfolgsrückruf. – MikeWyatt

0

Der Rückruf error wurde entwickelt, um bei einem Problem mit der Anforderung selbst verwendet zu werden. Gemäß der Dokumentation:

Eine Funktion, die aufgerufen wird, wenn die Anforderung fehlschlägt. Der Funktion werden drei Argumente übergeben: Das XMLHttpRequest-Objekt, eine Zeichenfolge, die den Typ des aufgetretenen Fehlers beschreibt, und ein optionales Ausnahmeobjekt, falls eines aufgetreten ist. Mögliche Werte für das zweite Argument (neben null) sind "timeout", "error", "notmodified" und "parsererror".

Also, wenn stattdessen ein Problem mit den Daten, die Sie zurückbekommen, dann sollten Sie mit ihm innerhalb der success Rückruf beschäftigen - vielleicht, indem Sie es auf die Konsole oder den Benutzer zu benachrichtigen.

+0

Ich benutze ziemlich viel AJAX in meiner Site, und das Wrappen jedes einzelnen Erfolgsrückrufs in einem try..catch-Block mit Protokollierung ist nicht ideal. – MikeWyatt

+0

Gibt es bestimmte Arten von Fehlern, die Sie auf Ihrer Website sehen? Was genau siehst du und was hast du vor, wenn du einen Fehler feststellst? –

+0

Ich möchte nur protokollieren, welche Ausnahmen möglicherweise ausgelöst werden. Der spezifische Ausnahmetyp spielt keine Rolle, außer dass er unerwartet ist. – MikeWyatt