角度Http承诺结果

时间:2014-01-02 21:50:15

标签: angularjs

我在$http附近编写了一些抽象,用于从安全服务进行调用。我遇到的问题是,在导致401的请求期间,延迟似乎没有正确传播。

我正在使用它,即使它是401,它也提醒我......我希望这会提醒bad

security.login('test', 'password').then(function (r) {
            alert('good');
        }, function (r) {
            alert('bad');
        });

Http Wrapper

angular.module('app').provider('http', function () {
    return {
        $get: ['$http', 'url', function ($http, url) {
            function http(config) {
                config.headers = {
                    'X-Requested-With': 'XMLHttpRequest'
                };
                config.url = url.formatUrl(config.url);
                return $http(config);
            }

            return {
                delete: function (url, data) {
                    return http({ url: url, data: data, method: 'DELETE' });
                },
                get: function (url) {
                    return http({ url: url, method: 'GET' });
                },
                post: function (url, data) {
                    return http({ url: url, data: data, method: 'POST' });
                },
                put: function (url, data) {
                    return http({ url: url, data: data, method: 'PUT' });
                }
            };
        }]
    };
});

安全服务

function User() {
    this.displayName = '';
    this.permissions = [];
}

angular.module('app').provider('security', function () {
    var _user = new User();

    return {
        $get: ['$rootScope', '$q', 'cookie', 'http', 'statePermissions', function ($rootScope, $q, cookie, http, statePermissions) {
            function login(params) {
                return http.post('SS/auth', params).then(function (response) {
                    cookie.set('authToken', response.data.authToken);
                    _user = response.data;

                    $rootScope.$broadcast('event:loginSuccessful', _user);

                    return response;

                }, function (response) {
                    cookie.expireNow('authToken');
                    _user = new User();

                    $rootScope.$broadcast('event:loginUnsuccessful', _user);

                    $q.reject(response);

                });
            }

            return {
                doesAuthTokenExist: function () {
                    return angular.isDefined(cookie.get('authToken'));
                },
                getUser: function () {
                    return _user;
                },
                isUserAuthorizedForPermission: function (permission) {
                    var x;

                    for (x = 0; x < _user.permissions.length; x++) {
                        if (_user.permissions[x] === permission) {
                            return true;
                        }
                    }

                    return false;
                },
                isUserAuthorizedForState: function (stateName) {
                    if (angular.isDefined(statePermissions[stateName])) {
                        return this.isUserAuthorizedForPermission(statePermissions[stateName]);
                    }

                    return true;
                },
                login: function (userName, password) {
                    return login({ username: userName, password: password });
                },
                loginWithAuthToken: function () {
                    var authToken = cookie.get('authToken');

                    return login({ provider: 'token', authToken: authToken });
                },
                logout: function () {
                    return http.post('SS/auth/logout').then(function () {
                        cookie.expireNow('authToken');
                        _user = new User();

                        $rootScope.$broadcast('event:logoutSuccessful', _user);

                        return true;
                    });
                }
            };
        }]
    };
});

1 个答案:

答案 0 :(得分:1)

你的$ http包装器看起来像是复制了angular的$ resource服务的功能。在这里查看文档:{​​{3}}

在简要介绍一下你的代码之后,似乎问题可能在于你如何使用$ q。尝试沿着这些方向重写您的登录方法。

有了这里的见解:
http://docs.angularjs.org/api/ngResource.$resource
http://docs.angularjs.org/api/ng.$q

function login(params) {

            var deferred = $q.defer();

            http.post('SS/auth', params).success(function (response) {
                cookie.set('authToken', response.data.authToken);
                _user = response.data;

                $rootScope.$broadcast('event:loginSuccessful', _user);

                deferred.resolve(response);

            }).error(function (error) {
                cookie.expireNow('authToken');
                _user = new User();

                $rootScope.$broadcast('event:loginUnsuccessful', _user);

                deferred.reject(error);

            });

            return deferred.promise;
        }

另外,只是好奇为什么你在这里使用提供商,因为它对我来说不是很明显?