您应该对不知道何时完成异步操作进行承诺。承诺“表示尚未完成的操作,但有望在将来进行。” (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的注释,
我需要做什么才能使myFuction()调用在.then()函数完成执行之前不会返回。
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()调用。因此,即使它可能使您的代码流变得更复杂,这种方式也更加有意义(毕竟,复杂性通常是异步/并行编程的普遍问题!)