【问题标题】:Am I correctly using promise?我是否正确使用了承诺?
【发布时间】:2015-02-23 11:59:13
【问题描述】:

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

我有一个用于登录用户的 AuthService,以及一个将身份验证令牌写入本地存储的 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');
        });
    }

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

【问题讨论】:

  • 似乎是正确的,您在控制台上是否有任何错误?有什么问题?
  • 我没有错误,只是在问自己是否这是以角度方式处理此问题的正确方法
  • 无关:我建议使用组合而不是继承:en.wikipedia.org/wiki/Composition_over_inheritance

标签: javascript angularjs authentication


【解决方案1】:

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

我会在 $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,它们在角度摘要期间会花费大量处理时间。

【讨论】:

  • 谢谢,我通常会尽量避免使用 $watch,因为正如你所说,它确实很贵,但可能是一种方法,我会尝试一下。对于var service = Object.create(ApiService);,我使用它是因为 ApiService 具有所有子服务所需的所有通用调用,是否有更好的继承方式?
  • 我真的不知道。我从未尝试过对服务进行任何继承
猜你喜欢
  • 1970-01-01
  • 2020-11-29
  • 2013-10-06
  • 2012-03-02
  • 2011-07-14
  • 2014-07-19
  • 2017-06-03
  • 1970-01-01
相关资源
最近更新 更多