Holen Sie sich den vollständigen call stack-trace der $http-Aufrufe
Sagen wir mal, jemand hat eine Methode wie Sie diese in eine Datei namens app.js
versucht Registrierungsvorgang einen XHR-request angainst eine nicht vorhandene url:
app.controller('MainCtrl', function($scope,$http) {
$scope.send = function() {
$http.get('http://run.plnkr.co/thisIs404');
};
});
Sehe ich einen Fehler bezüglich der URL http://run.plnkr.co/thisis404
in der Konsole und Netzwerk":
Debuggen will ich das schnell finden, wo dieser XHR Aufruf erfolgte in den Quellen (dh wo die app.js
- Datei) :
Also ich aktivieren, in den chrome dev tools :
- asynchrone Debuggen in Aufruf-stack
- debug jedem XHR -
Debugger tatsächlich aufhört, auf XHR-request, aber der call stack zeigt nur Referenzen zu angular.js "core" - Dateien : keine Referenz zu app.js
überall zu finden.
Habe ich versucht, diese mit Chrom 36 und chrome 35. Einzige Lösung : suchen Sie für die falsche URL in der gesamten code-Basis (die in einigen Fällen schwer sein kann, zu tun).
- Nicht die async-debug-Modus zeigen soll, zu
app.js
irgendwo in dem Stapel ? - Ist es ein Weg, um track down es
app.js
- Datei einfach von der Konsole Fehler ?
Mit Vanille-XHR-Anfragen (D. H. ohne eckige), XHR Debuggen die Aufrufliste zeigt die XHR-Aufrufe in app.js
(was ist einfacher zu Debuggen, in diesem Fall) :
Vollständiges Beispiel hier : http://plnkr.co/edit/lnCRpv?p=preview
[BEARBEITEN]
Wie ich schon gefragt worden : Angular.js ist nicht minified in meinen tests.
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, sehen Sie, das Problem ist vor allem, weil eckig s $http saugt. Tut mir Leid, dass.
Lassen Sie uns versuchen, die bluebird Bibliothek, denn es bietet langen stack traces.
Erhalten Sie die folgende Stapelüberwachung:
(Plunker hier.)
Die wichtigste Linie ist die erste:
Possibly unhandled Error: [object Object]
.Yep. Ein Objekt geworfen wird, ist nicht eine Reale
Error
Objekt, mit demstack
- Eigenschaft angefügt. Für die Referenz, hier ist, wie zu werfen einen Fehler und halten Sie Ihren stack, zusammen mit: https://github.com/Ralt/newerror/blob/master/index.jsSo, wie man dieses Problem beheben? Es hängt von mehreren Entscheidungen:
Wenn Sie hinzufügen möchten ein echtes Versprechen lib verwenden bluebird. AFAIK, es ist einer der wenigen, die für langen stack traces, und es ist die Schnellste, die es gibt.
Für eine ordnungsgemäße xhr-lib, wirft echte Fehler, ich fürchte, du bist aus Glück gibt. Schreiben einer benutzerdefinierten mit der Unterstützung für Browser, die Sie wollen, ist nicht wirklich schwer aber. Ohne IE8-Unterstützung, diese funktioniert (mit bluebird):
(Plunker hier.)
Wie Sie sehen können, ist der stack trace ist informativ:
XHR-Anfragen stapeln sich in
$http.pendingRequests
array und später senden. Das ist der Grund, warum Sie nicht finden können, ein direkter verknüpft, zwischen denen$http
genannt wird und wo die tatsächlichen XHR-Anfrage gemacht wird.Wenn Sie wissen möchten, welche Funktion aufgerufen
$http
setzen Sie einen Haltepunkt in$http
Funktion.Es Arten der Niederlage der ganze "XHR Haltepunkte" Zweck meiner Meinung nach.
Einer option, die kam in mein Geist ist zu erstellen, ein Modul für den $http-debugging, die Sie hinzufügen können es als Abhängigkeit in deinem main-Modul, wenn Sie brauchen, um debug $http calls. Gibt es einen decorator für den $http-Dienst registriert werden kann, wird melden Sie sich einfach, die Argumente des Aufrufs eine Weiterleitung an den $http-service. Dort ein breakpoint gesetzt werden kann, auch.
Habe ich eine einfache Beispiel arbeiten hier. Ich hoffe, es wird helfen.
Beispiel $http-logger decorator-Implementierung: