tokuhirom's Blog

ngResource はどうやって値を埋めているのか

ngResource は AngularJS で RESTful API を call する際につかえるクライアントライブラリだが、これがなかなかマジカルな動きをする。

具体的には、以下のようなコードがなぜか動く。HTTP リクエストが実行された後で $scope.entries にいい感じにレスポンスがうまっているのだ。

$scope.entries = $resource(‘/entry’).query();

通常なら動かなそうなコードだ。なぜこれが動いてしまうのか。

なぜ動くのか

$scope.entries = $resource(‘/entry').query();

のとき、ngResource の内部では以下のようなことが起きている。

$scope.foo = (function () {
	// 空の配列を作る
	var value = [ ];

	$http.get(‘/foo’).then(function (res) {
		res.data.forEach(function (v) {
			// $scope に入れるオブジェクトの参照はクロージャで保持されている
			value.push(v);
		});
	});

	// 空の配列をとりあえず返して、後から非同期に値を埋める
	return value;
})();

そう、仕組みがわかってしまえばなんのことはない。空の配列なりオブジェクトなりをかえしておいて、後から埋めているだけなのだ。