Angularjs 角度工厂通过$q promis返回令牌

Angularjs 角度工厂通过$q promis返回令牌,angularjs,angular-promise,Angularjs,Angular Promise,我试图创建一个工厂,将令牌返回给控制器。此代码仅在从服务器获取令牌时有效,但不会将令牌传递回控制器。令牌在控制器中返回为空。请告知。多谢各位 securityApp.factory("getTokenFromServer", function ($http, $q) { var token; function getToken(userName, password) { var deferred = $q.defer(); $ht

我试图创建一个工厂,将令牌返回给控制器。此代码仅在从服务器获取令牌时有效,但不会将令牌传递回控制器。令牌在控制器中返回为空。请告知。多谢各位

securityApp.factory("getTokenFromServer", function ($http, $q) {

    var token;     

    function getToken(userName, password) {

        var deferred = $q.defer();

        $http({
            method: 'POST', url: 'http://localhost:62791/token', data: { username: userName, password: password, grant_type: 'password' }, transformRequest: function (obj) {
                var str = [];
                for (var p in obj)
                    str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
                return str.join("&");
            }
        }).then(function (data) {
            token = data.access_token;
            deferred.resolve(token);
        });

        return deferred.promise;
    }

    return {
        getToken: getToken
    };

});


securityApp.controller('membersController', function ($scope, $http, getTokenFromServer) {

    $scope.username = 'aharris1@test.com';
    $scope.password = 'SuperPass1!';

    getTokenFromServer.getToken($scope.username, $scope.password).then(function (data) {
        $scope.token = data;
        alert($scope.token);
        $http({ method: 'GET', url: '/api/Members/?access_token=' + $scope.token, headers: { 'Authorization': 'Bearer ' + $scope.token } })
            .then(function (response) {
                $scope.members = response.data;
            });
    });

});

这是因为您没有以正确的方式访问数据。当使用
时,则
承诺链的结果是数据、状态等的组合。。(当与成功回调相反时,成功回调会分解片段并将数据作为第一个参数提供给您)因此我认为您应该查找
result.data.access\u token
,而不是
result.access\u token

    .then(function (result) {
        token = result.data.access_token;
        deferred.resolve(token);
    });
有了这些,您只需简化api方法即可返回http promise本身,而无需创建延迟对象:-

securityApp.factory("getTokenFromServer", function ($http, $q) {
    function getToken(userName, password) {
       return $http({
            method: 'POST', url: 'http://localhost:62791/token', data: { username: userName, password: password, grant_type: 'password' }, transformRequest: function (obj) {
                var str = [];
                for (var p in obj)
                    str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
                return str.join("&");
            }
        }).then(function (result) {
            return result.data.access_token; //Return the data

        }, function(errorResponse) {
            return $q.reject(errorResponse.data);//Reject or return
        });
    }

    return {
        getToken: getToken
    };

});