いつ完了するかわからない非同期操作には promise を使用する必要があります。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);
});
}
編集: .then() 関数が実行を終了するまで myFuction() 呼び出しが返されないようにするために何をする必要があるかというSujoys のコメントについて。
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 はすぐに返されるため、その間、ブラウザは自由に他のコードを続行できます。promise が解決/失敗すると、 then() 呼び出しがトリガーされます。したがって、コードの流れがもう少し複雑になる可能性があるとしても、この方法ははるかに理にかなっています (結局のところ、複雑さは一般的に非同期/並列プログラミングの一般的な問題です!)