Search code examples
angularjsangular-promisechain

$q promise error callback chains


In the following code snippet error 1 and success 2 will be logged. How can I can I propagate error callbacks being invoked rather than the success callbacks being invoked if the original deferred is rejected.

angular.module("Foo", []);
angular
.module("Foo")
.controller("Bar", function ($q) {
    var deferred = $q.defer();
      deferred.reject();

      deferred.promise
          .then(
              /*success*/function () { console.log("success 1"); },
              /*error*/function () { console.log("error 1"); })
          .then(
              /*success*/function () { console.log("success 2"); },
              /*error*/function () { console.log("error 2"); });
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="Foo">
    <div ng-controller="Bar"></div>
</div>


Solution

  • Error is propagate by returning $q.reject in the error callback

        var deferred = $q.defer();
          deferred.reject();
    
          deferred.promise
              .then(
                  /*success*/function () { console.log("success 1"); },
                  /*error*/function () { console.log("error 1"); return $q.reject('error 1')})
              .then(
                  /*success*/function () { console.log("success 2"); },
                  /*error*/function () { console.log("error 2"); });
    });