AngularJS: Forwarding rejection of a promise to the next promise in chain

Note that this is somewhat similar to `try/catch/throw`.

by Ahmad Baktash Hayeri

HTML

<div ng-app="app">
  <div ng-controller="ctrl">
    <pre>PromiseA Status: {{ !promiseAStatus ? 'Pending' : promiseAStatus }}</pre>
    <pre>PromiseB Status: {{ !promiseBStatus ? 'Pending' : promiseBStatus }}</pre>
    <pre>PromiseC Status: {{ !promiseCStatus ? 'Pending' : promiseCStatus }}</pre>
  </div>
</div>

JavaScript

angular.module('app', [])
	.controller('ctrl', function($scope, $q, $timeout){
  	var promiseA = $q.defer(),
    	promiseB = $q.defer();
    
    $timeout(function(){
    	$scope.promiseAStatus = 'Rejected';
    	promiseA.reject('Unknown');
      //promiseA.resolve('All clear!');
    }, 3000);
    
    promiseB = promiseA.promise.then(function(){
    	console.log('a is done')
    }, function(reason){
    	return $q.reject(reason);
    });
    
    promiseC = promiseB.then(function(response){
    	$scope.promiseBStatus = 'Done => reason :' + response;
    }, function(reason){
    	$scope.promiseBStatus = 'Failed => reason: ' + reason;
      return $q.reject(reason)
    });
    
    promiseC.then(function(){
    	$scope.promiseCStatus = 'Success';
    }, function(reason){
    	$scope.promiseCStatus = 'Failed again => reason: ' + reason;
    })
  });