shi*_*ork 3 javascript angularjs
我开发了一个angularjs应用程序,我有一个REST API用于从我的角度应用程序中获取应用程序资源.当用户自己登录时,我将他的访问令牌保存在cookie中,如果他刷新页面我想从令牌中获取用户信息,如下所示:
mymodule.run(function ($rootScope, $cookies, AuthService, Restangular) {
if ($cookies.usertoken) {
// call GET api/account/
Restangular.one('account', '').get().then( function(user) {
AuthService.setCurrentUser(user);
});
}
});
Run Code Online (Sandbox Code Playgroud)
AuthService:
mymodule.factory('AuthService', function($http, $rootScope) {
var currentUser = null;
return {
setCurrentUser: function(user) {
currentUser = user;
},
getCurrentUser: function() {
return currentUser;
}
};
});
Run Code Online (Sandbox Code Playgroud)
但是如果用户访问需要用户变量的控制器:
mymodule.controller('DashboardCtrl', function (AuthService) {
var user = AuthService.getCurrentUser();
});
Run Code Online (Sandbox Code Playgroud)
控制器代码在api调用结束之前执行,所以我有一个null var.在启动控制器之前有没有一个好的解决方案等待用户数据加载?
我找到了这个链接,但我正在寻找一个更全局的方法来初始化应用程序上下文.
这是我喜欢处理这个问题的一种方法,假设Restangular从then(我没有使用Restangular)返回新的promise .承诺可以存储在某个地方AuthService,然后在控制器中使用.首先,添加一个属性AuthService来保存新的承诺:
return {
authPromise: {}, // this will hold the promise from Restangular
// setCurrentUser, getCurrentUser
// ...
Run Code Online (Sandbox Code Playgroud)
调用Restangular时,保存promise并确保返回用户数据,以便控制器可以在以后访问它,如下所示:
AuthService.authPromise = Restangular.one('account', '').get()
.then( function(user) {
AuthService.setCurrentUser(user);
return user; // <--important
});
Run Code Online (Sandbox Code Playgroud)
最后,在控制器中创建一个新的承诺来设置user变量:
mymodule.controller('DashboardCtrl', function (AuthService) {
var user;
AuthService.authPromise.then(function(resultUser){
user = resultUser;
alert(user);
// do something with user
});
});
Run Code Online (Sandbox Code Playgroud)
演示:这是一个小提琴,我用它模拟了一个AJAX调用$timeout.超时结束时,promise将解析.
| 归档时间: |
|
| 查看次数: |
2901 次 |
| 最近记录: |