Possibly unhandled rejection in Angular 1.6

前端 未结 9 1560
轻奢々
轻奢々 2020-12-06 04:31

I have a code with AngularJS:

service.doSomething()
  .then(function(result) {
      //do something with the result
  });

In AngularJS 1.5.

相关标签:
9条回答
  • 2020-12-06 04:40

    I have solved this error by adding a default value in the catch block like:

    service.doSomething()
        .then(function(response) {
            var x = null;
            var y = x.y;
        }).catch(function(error) {
            var y = 0;
        });
    

    (take in count that I am not an experienced angular developer)

    0 讨论(0)
  • 2020-12-06 04:42

    I got same unhandled rejection error when a rejected promise is not handled by angular-ui-router (ui-sref) using angular ver1.6.1 & This feature is enabled by default.

    For anyone that wants a workaround (not recommended, though), you can globally silence unhandled promise rejections like this —

    app.config(['$qProvider', function ($qProvider) { $qProvider.errorOnUnhandledRejections(false); }]);

    0 讨论(0)
  • 2020-12-06 04:43

    There is another case, adding a finally() handler to a promise generate the error: http://plnkr.co/edit/eT834BkIEooAMvrVcLDe

    Because finally() creates a new promise and call the resolver on it. (Rejecting a 2nd one in a rejection case)

    Ive put a fix in the plnkr but it doesn't look very good.

    0 讨论(0)
  • 2020-12-06 04:45

    This information helped me to track down what (in my case) was creating the promise and not adding an error handler. I found it buried in the discussion of issue #2889 "Possibly unhandled rejection with Angular 1.5.9".

    The gist, is, patch $q to cache a stack-trace on creating promises, such that it can be retrieved when the error is triggered.

    To do it, insert this code to decorate $q somewhere near the top of your angular app:

    // Decorate the $q service when app starts
    app.decorator('$q', ["$delegate", function($delegate) {
      // Create a new promise object
      var promise = $delegate.when();
    
      // Access the `Promise` prototype (nonstandard, but works in Chrome)
      var proto = promise.__proto__;
    
      // Define a setter for `$$state` that creates a stacktrace 
      // (string) and assigns it as a property of the internal `$$state` object.
      Object.defineProperty(proto, '$$state', {
        enumerable: true,
        set: function(val) {
          val.stack = new Error().stack;
          this._$$state = val;
        },
        get: function() {
          return this._$$state;
        }
      });
    
      return $delegate;
    }]);
    

    Then search the angular code for the message "possibly unhandled rejection" and put a breakpoint on that line. When the breakpoint is reached, print out the value of toCheck.stack on the console, and you'll see something like this:

    >> toCheck.stack
    "set@http://localhost:8000/js/dual-site.js:18:19
    Promise@http://localhost:8000/js/angular.js:17008:22
    then@http://localhost:8000/js/angular.js:17016:20
    catch@http://localhost:8000/js/angular.js:17026:14
    SyncStrategy.prototype.send@http://localhost:8000/js/angular-state-machine.js:436:24
    StateMachine/this.send@http://localhost:8000/js/angular-state-machine.js:235:16
    

    The offending code is the frame calling angular's catch/then functions.

    0 讨论(0)
  • 2020-12-06 04:45

    I have the problem even with version 1.6.1 in my httpErrorInterceptor, for one usecase my if my api return 404 i have to try another request with other data... so in this case i only reject the request and angular throw the unhandled rejection error...

    I install 1.5.9 and now there is no more error !

    0 讨论(0)
  • 2020-12-06 04:49

    I fixed the same problem with version 1.6.1 by upgrading angular-ui-router to 0.3.2.

    0 讨论(0)
提交回复
热议问题