我正确使用诺言吗?

时间:2015-02-23 11:59:13

标签: javascript angularjs authentication

我是angularJs的新手,我正在尝试在我的应用程序中实现登录/注销。

我有一个用户登录的AuthService,以及一个将auth令牌写入本地存储的SessionService(我正在使用jwt)

这里是AuthService:

'use strict';

angular.module('App')
.factory('AuthService', ['ApiService', 'SessionService', '$q', '$timeout', 'jwtHelper', function (ApiService, SessionService, $q, $timeout, jwtHelper) {

    // inherit
    var service = Object.create(ApiService);

    service.login = login;
    service.logout = logout;
    service.check = check;
    service.user = user;

    return service;

    function login(credentials) {
        return service.form('user.login', credentials)
            .then(function success(response) {
                SessionService.setToken(response.token);
                return response;
            });
    }

    function logout() {

        // here we use a promise so it's easier to handle
        // logout in the controller by chaining methods

        var d = $q.defer();

        $timeout(function () {
            SessionService.setToken();
            d.resolve();
        }, 0);

        return d.promise;
    }

    function check() {
        var token = SessionService.getToken();
        return !!token && !jwtHelper.isTokenExpired(token);
    }

    function user() {
        return service.call('user', {cache: true});
    }

}]);

我在注销方法中面临的问题。我没有服务器调用,只是清除本地存储并且用户已注销,但我想通过一个承诺来处理这个,所以在控制器中我可以执行以下操作:

       function logout() {
        AuthService.logout().then(function success() {
            $state.go('login');
        });
    }

这是实现这个目标的好方法吗?

1 个答案:

答案 0 :(得分:0)

我认为在您的特定情况下不需要承诺,我会以另一种方式设计:

我会在$ rootScope中存储一个“authenticatedUser”,其中包含一些我可能会发现有用的参数(用户文化,角色,......(如果没有其他要求,则只是一个布尔值)。)

在一种“applicationController”中,我会看$ watch *寻找它的值:

$rootScope.$watch('authenticatedUser', function(newVal, oldVal){
    if (newVal == oldVal)
        return;

    if (newVal == null){ //User has been disconnected
        //Remove everything from screen
        //Display login form
    }
});

所以,在你的控制器中,我只会:

function logout() {
    AuthService.logout();
}

这样,如果有一天你决定能够从另一个控制器注销(我们永远不知道会发生什么;-)),你只需要打电话给你的服务,一切都会完成。不需要重复代码。

此外,您的代码中还有一些我不理解的内容:

// inherit
var service = Object.create(ApiService);

在角度中,每个服务都是在角度引导期间实现的单例。您确定要覆盖此默认行为吗?

  • :注意$ watch,它们会在角度消化过程中花费大量处理时间。