Get the full call stack trace of $http calls

后端 未结 3 871
不思量自难忘°
不思量自难忘° 2021-02-05 09:03

Let\'s say someone wrote a method like this in a file called app.js trying to peform an XHR request angainst a non existing url:

app.controller(\'Ma         


        
3条回答
  •  误落风尘
    2021-02-05 09:45

    So, you see, this issue is mostly because angular's $http sucks. Sorry about that.

    Let's try to use the bluebird library, because it provides long stack traces.

    Promise.longStackTraces();
    Promise.resolve($http.get('...'));
    

    You get the following stack trace:

    Possibly unhandled Error: [object Object]
        at Promise$_rejectFromThenable (http://cdn.jsdelivr.net/bluebird/1.2.4/bluebird.js:4736:52)
        at wrappedErrback (https://code.angularjs.org/1.3.0-beta.5/angular.js:11334:78)
        at wrappedErrback (https://code.angularjs.org/1.3.0-beta.5/angular.js:11334:78)
        at wrappedErrback (https://code.angularjs.org/1.3.0-beta.5/angular.js:11334:78)
        at https://code.angularjs.org/1.3.0-beta.5/angular.js:11467:76
        at Scope.$eval (https://code.angularjs.org/1.3.0-beta.5/angular.js:12418:28)
        at Scope.$digest (https://code.angularjs.org/1.3.0-beta.5/angular.js:12230:31)
        at Scope.$apply (https://code.angularjs.org/1.3.0-beta.5/angular.js:12522:24)
        at done (https://code.angularjs.org/1.3.0-beta.5/angular.js:8207:45)
        at completeRequest (https://code.angularjs.org/1.3.0-beta.5/angular.js:8412:7) 
    

    (Plunker here.)

    The most important line is the first: Possibly unhandled Error: [object Object].

    Yep. An object is thrown, not a real Error object, with the stack property attached to it. For the reference, here is how to throw an error and keep its stack along with it: https://github.com/Ralt/newerror/blob/master/index.js

    So, how to fix this? It depends on several decisions:

    • Do you want to add a proper Promise lib that enables long stack traces?
    • Do you want to use another xhr lib that throws correct errors?

    If you want to add a real Promise lib, use bluebird. AFAIK, it is one of the few that provides long stack traces, and it is the fastest one out there.

    For a proper xhr lib that throws real errors, I'm afraid you're out of luck there. Writing a custom one with the support for browsers you want isn't really hard though. With no IE8 support, this works (with bluebird):

    function xhr(url) {
        return new Promise(function(resolve, reject) {
            var xhr = new XMLHttpRequest();
            xhr.onload = function() {
                resolve(xhr.responseText);
            };
            xhr.onerror = reject;
            xhr.open('GET', url);
            xhr.send();
        });
    }
    

    (Plunker here.)

    As you can see, the stack trace is informative:

    correct stack trace

提交回复
热议问题