AngularJSのData-bindingおかげで、ModelのObjectに変更があると、
すぐに$watch
に捉えられ、Viewに反映することができます。
この特性をうまく利用すれば、非同期のものでも同期のように書けるのです。
例えば、下のように
var fooApp = angular.module('fooApp');
fooApp.controller('userCtrl', function($scope, User) {
$scope.user = User.getUser('foo'); // 同期のようにしか見えないよね(ドヤッ
});
引き続きUser Serviceの実装を見ていきます
fooApp.factory('User', function($http) {
return {
getUser: function (username) {
// 1.空きObjectを作成し
result = {}
$http.get('/api/user/' + username).success(function(data) {
// 3.データ取得できたら、元のObjectに内容を追加
angular.extend(result, data);
});
// 2.とりあえずObjectのPointerだけを渡す
return result;
}
}
});
まとめれば、
1.うまくPointerだけを先に返し、
2.Responseが来たら、前のPointerを拾って、内容を流し込む
という手順でやると、非同期も同期のように書けるわけです。
この仕組みはAngularJSだけではなく、
ほかにData-bindingのできるフレームワークでも行けると思います。