Serial promise resolving

by Miroslaw Niepokoj

by cchana

HTML

<link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/bootstrap.css">
<div ng-app>
  <div ng-controller="TestCtrl">
    resolved: {{resolved|json}}
  </div>
</div>

JavaScript

function TestCtrl($scope, $q, $timeout) {
	$scope.resolved = [];
 // function by miroslaw niepokoj
	function runTasks(data) {
    var defer = $q.defer();
    var start = $q.when();
    var nr;
    for (var i=0; i<data.length; i++) {
			nr = data[i];
      console.log('defining for ', nr);
			start = start.then(

  			(function(val){
          console.log('return function for', val);

          return function(){

            console.log('invoke for', val);

              var d = $q.defer();
              $timeout(function(){
                console.log('timeout for', val);
                $scope.resolved.push(val);
                d.resolve();
              }, 1000);
              return d.promise;
          };
        })(nr)
        
      );
    }// end loop
    start.then(defer.resolve);
    return defer.promise;
  }
  
  runTasks([9,8,7,6,5,4,3,2,1]).then(function(){
  	console.log('finish!');
    $scope.resolved.push('finish');
  });
}