我是角色承诺的新手。我只是想知道,如何同步解决这个承诺。例如,
var app = angular.module("app", []);
app.service("githubService", function($http, $q) {
var deferred = $q.defer();
this.getAccount = function() {
console.log(2)
return $http.get('https://api.github.com/users/haroldrv')
.then(function(response) {
// promise is fulfilled
deferred.resolve(response.data);
return deferred.promise;
}, function(response) {
// the following line rejects the promise
deferred.reject(response);
return deferred.promise;
});
};
});
app.controller("promiseController", function($scope, $q, githubService) {
console.log(1)
githubService.getAccount()
.then(
function(result) {
console.log(3)
// promise was fullfilled (regardless of outcome)
// checks for information will be peformed here
$scope.account = result;
},
function(error) {
console.log(3)
// handle errors here
console.log(error.statusText);
}
);
console.log(4)
});
在上面的代码中,值按以下顺序打印1,2,4,3。这就是调用服务并同步获取响应。但在它解决它收到的http承诺之前,它会到达下一行。我尝试在响应中使用另一个延迟,但它不起作用。那么如何在'3'之后达到'4'?以下是plunker链接http://plnkr.co/edit/AI8OJAgqFDVXb1fRYbix?p=preview
对此的任何帮助将不胜感激。
答案 0 :(得分:3)
你不能,这是异步调用的本质。您希望在调用完成后执行的任何代码都必须放在回调中。第4个日志语句'跳过'异步调用,因此立即执行。
提示:创建延迟对象始终是代码气味:99%的时间你真的不需要它。例如,您可以像这样编写服务代码,它将完全相同,但您的代码要短得多:
app.service("githubService", function($http, $q) {
this.getAccount = function() {
console.log(2)
return $http.get('https://api.github.com/users/haroldrv')
.then(function(response) {
return response.data;
});
};
});
如果要真正优秀地解释承诺,请查看诺兰劳森的this博客文章。
答案 1 :(得分:0)
-v
电话,那么您就没有
要在服务中调用$http
,它将向控制器返回承诺。.then()
和
那里有.success()
个回调。.error()
它的位置永远不会得到
执行是因为它是在console.log(4)
之后定义的
因为JavaScript是,所以会立即以这种方式执行
异步。 githubService.getAccount()
只会注册
它的回调将继续前进。我为您创建了一个plunker,以便更好地了解javascript / angular中的承诺。
希望这有帮助