いつ完了するかわからない非同期操作では、promiseを使用する必要があります。約束は、「まだ完了していないが、将来的に予想される操作を表します」。(https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise)
実装例は次のようになります。
myApp.factory('myService', function($http) {
var getData = function() {
// Angular $http() and then() both return promises themselves
return $http({method:"GET", url:"/my/url"}).then(function(result){
// What we return here is the data that will be accessible
// to us after the promise resolves
return result.data;
});
};
return { getData: getData };
});
function myFunction($scope, myService) {
var myDataPromise = myService.getData();
myDataPromise.then(function(result) {
// this is only run after getData() resolves
$scope.data = result;
console.log("data.name"+$scope.data.name);
});
}
編集:Sujoysについて、
.then()関数の実行が完了するまでmyFuction()呼び出しが返らないようにするために何をする必要があるかについてコメントします。
function myFunction($scope, myService) {
var myDataPromise = myService.getData();
myDataPromise.then(function(result) {
$scope.data = result;
console.log("data.name"+$scope.data.name);
});
console.log("This will get printed before data.name inside then. And I don't want that.");
}
さて、getData()の呼び出しが完了するまでに10秒かかったとしましょう。その時間内に関数が何も返さなかった場合、それは事実上通常の同期コードになり、完了するまでブラウザーをハングさせます。
約束はすぐに戻るので、ブラウザはその間他のコードを続行できます。promiseが解決または失敗すると、then()呼び出しがトリガーされます。したがって、コードのフローが少し複雑になる場合でも、この方法の方がはるかに理にかなっています(結局のところ、複雑さは非同期/並列プログラミングの一般的な問題です!)