我用诺言是对的吗
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,它们在角度摘要过程中需要花费大量的处理时间