2015-02-23 67 views
1

我是新来的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'); 
     }); 
    } 

这是一个实现这个好方法?

+0

似乎是正确的,你有控制台上的任何错误?问题是什么? – 2015-02-23 12:11:33

+0

我没有错误,只是询问我自己,如果这是以正确的方式处理这个问题的正确方法 – kitensei 2015-02-23 12:30:21

+0

无关:我会建议使用组合而不是继承:http://en.wikipedia.org/wiki/Composition_over_inheritance – Martin 2015-02-23 12:41:28

回答

0

我觉得没有必要为你的具体情况一个承诺,我会以另一种方式设计的:

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

在一种 “ApplicationController中” 的,我想有一个$手表*寻找它的值:

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

谢谢,我通常会尽量避免$ watch,正如你所说,它非常昂贵,但可能是一种方式,我会试一试。对于'var service = Object.create(ApiService);'我使用它是因为ApiService具有所有子服务所需的所有泛型调用,是否有继承的更好方法? – kitensei 2015-02-23 12:32:38

+0

我真诚地不知道。我从来没有尝试过任何对服务的继承 – 2015-02-23 12:52:45