我得到了一个服务,它首先需要检索一个accesstoken,然后是一个User对象。完成这些操作后,需要采取进一步的UI操作。我遇到的问题是login().then()是用有效的Session调用的。但是Session.user的一个未解析的承诺。所以我不能做任何逻辑基于用户的信息(例如角色,等)
我有以下代码:
在controllers.js中(login()在表单凭证按钮点击时被调用)
.controller('LoginController',
function($scope, SessionService) {
$scope.credentials = {
username : '',
password : ''
};
$scope.login =
function() {
SessionService.login($scope.credentials).then(function() {
console.info("succesfully logged in as user " + JSON.stringify(Session));
// further UI actions..
});
};
})
在services.js .factory('SessionService',
function(User, Session, AuthorizationService) {
return {
login : function(credentials) {
return AuthorizationService.requestToken(credentials)
.then(function(token) {
console.info("Got token: " + token);
if (!!token) {
Session.create(token);
console.info("Fetching user...");
return User.get({
id : 'me'
});
} else {
throw (new Error("Could not log in"));
}
}).then(function(user) {
console.info("Got user: " + user);
if (!!user) {
Session.user = user;
} else {
throw (new Error("Could not fetch user"));
}
});
},
};
})
下面是控制台的输出:
- get token: cf9c0eba82d872508f7dcc0b234f0d52 services.js:120
- 抓取用户……
- services.js:124 get user: [object object]
- services.js:132作为用户成功登录{"令牌":"cf9c0eba82d772508f7dcc0b234f0d52","用户":{" $承诺":{},"美元解决":假}}
User
对象是由$resource
创建的,不是promise;它是最终将用用户信息填充的实际对象,但是在代码的这一点上,它不包含任何内容。
解决方法很简单:从第一个then
开始:
return User.get({...}).$promise;
下一个then
将与预期的用户对象一起调用,但只有在实际获取数据时才会调用。