同步AngularJS$http调用

同步AngularJS$http调用,angularjs,Angularjs,我的Angular应用程序中有一个服务,负责授权用户并返回身份验证令牌 但是,由于$http的异步特性,我无法正确隔离服务的逻辑。相反,我必须返回一个承诺,并将解释响应的逻辑推送到服务调用方(单一责任红旗) 考虑到这一点,这让我重新考虑我是否正确地思考了这个问题。我来自一个Java世界,那里的大多数交互都是同步的,所以当我试图用单一的责任来构建一个干净的设计时,有些东西不适合我 我错过了什么 更新 我意识到以下内容无法按预期工作,但这是我的想法,至少我希望它能够工作: app.service('

我的Angular应用程序中有一个服务,负责授权用户并返回身份验证令牌

但是,由于$http的异步特性,我无法正确隔离服务的逻辑。相反,我必须返回一个承诺,并将解释响应的逻辑推送到服务调用方(单一责任红旗)

考虑到这一点,这让我重新考虑我是否正确地思考了这个问题。我来自一个Java世界,那里的大多数交互都是同步的,所以当我试图用单一的责任来构建一个干净的设计时,有些东西不适合我

我错过了什么

更新 我意识到以下内容无法按预期工作,但这是我的想法,至少我希望它能够工作:

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
方法忽略返回值,已被弃用。看看感谢你解释的情况-这对我来说非常有效!