ワシはワシが育てる

週刊少年ジャンプと任天堂のゲームが三度のメシより好きです。

AngularJSで複数の同期処理を行う

AngularJSにはpromise/deferredの実装を$qを使用することによって行います。
これによってコールバックを待って次の処理を行うことができ、また複数の処理の場合も

var get1 = $http.get('/');
var get2 = $http.get('/hoge');

$q.all([get1, get2]).then(function(results) {
  console.log(results);
});

といった具合に配列にまとめるだけで簡単に実行できてしまいます。
これにて一件落着…といいたいところですが問題があります。

例えばget1のコールバックの結果を受け取り、それを元に次の処理を実行したい場合はどうでしょうか。
$q.allだと全ての処理が終了するまでコールバックを受け取ることができず、柔軟に対応することができません。

この点に関してイケてる方法があるのかもしれませんが、個人的には以下のようにすると良いのではと考えています。

$scope.urls = ['/', '/hoge'];
$scope.$emit('executeTask');

$scope.$on('executeTask, (event, data) {
  $http.get(urls[0)
  .success(function (data, status) {
    $scope.emit('finishTask', data):
  });
});

$scope.$on('finishTask', (event, data) {
  $scope.urls.splice(0, 1);
  if ($scope.urls.length >= 1) {
    $scope.$emit('executeTask', data);
  }
});

「executeTask」というイベントを受け取ったら処理を実行し、終了したら「finishTask」で結果を受け取り、そこで再び「executeTask」を実行するというもの。
全くイケてない方法ですが、一応目的は達成できるはず。