同步AngularJS$http调用
我的Angular应用程序中有一个服务,负责授权用户并返回身份验证令牌 但是,由于$http的异步特性,我无法正确隔离服务的逻辑。相反,我必须返回一个承诺,并将解释响应的逻辑推送到服务调用方(单一责任红旗) 考虑到这一点,这让我重新考虑我是否正确地思考了这个问题。我来自一个Java世界,那里的大多数交互都是同步的,所以当我试图用单一的责任来构建一个干净的设计时,有些东西不适合我 我错过了什么 更新 我意识到以下内容无法按预期工作,但这是我的想法,至少我希望它能够工作:同步AngularJS$http调用,angularjs,Angularjs,我的Angular应用程序中有一个服务,负责授权用户并返回身份验证令牌 但是,由于$http的异步特性,我无法正确隔离服务的逻辑。相反,我必须返回一个承诺,并将解释响应的逻辑推送到服务调用方(单一责任红旗) 考虑到这一点,这让我重新考虑我是否正确地思考了这个问题。我来自一个Java世界,那里的大多数交互都是同步的,所以当我试图用单一的责任来构建一个干净的设计时,有些东西不适合我 我错过了什么 更新 我意识到以下内容无法按预期工作,但这是我的想法,至少我希望它能够工作: app.service('
app.service('AuthenticationService', ['$http', '$httpParamSerializerJQLike', function($http, $httpParamSerializerJQLike)
{
this.authServerBaseURL = "...";
this.clientId = "...";
this.authenticate = function(username, password)
{
var config =
{
headers:
{
"Content-Type" : 'application/x-www-form-urlencoded',
"Authorization" : "Basic " + btoa(this.clientId + ":")
}
}
var body = $httpParamSerializerJQLike(
{
grant_type : "password",
username : username,
password : password
});
return $http.post(this.authServerBaseURL + '/oauth/token', body, config).
success(function(data, status, headers, config)
{
return data.access_token;
}).
error(function(data, status, headers, config)
{
return false;
});
}
}]);
添加代码后更新:您的思维过程可以工作,请参见下文。但是,不要使用
.success
和.error
。如果您改为使用。那么
,如我下面的示例所示,它将起作用
假设您的代码与此类似:
// AuthService
this.authenticate = function() {
return $http.post('http://example.com', body, config);
}
// Using it:
AuthService.authenticate().then(function(data) {
var token = data.access_token;
});
您可以将有关如何提取数据的知识移动到服务中,如下所示:
// AuthService
this.authenticate = function() {
return $http.post('http://example.com', body, config).then(function(data) {
return data.access_token;
});
}
// Using it:
AuthService.authenticate().then(function(token) {
var token = token;
});
这里发生的事情是,您通过调用
。然后在$http
promise上执行一个新的承诺,这就是返回的内容。承诺是链接的,因此$http
承诺将解析此新承诺,然后使用提取的令牌自行解析。根据您的更改更新了我的答案。success
和error
方法忽略返回值,已被弃用。看看感谢你解释的情况-这对我来说非常有效!