我用诺言是对的吗

Am I correctly using promise?

本文关键字:诺言      更新时间:2024-03-14

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

我有一个AuthService,它让用户登录,还有一个SessionService,它将auth令牌写入本地存储(我使用的是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');
        });
    }

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

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

我会在$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);

在angular中,每个服务都是在angular引导过程中安装的单例服务。您确定要覆盖此默认行为吗?

  • :注意$watches,它们在角度摘要过程中需要花费大量的处理时间