嵌套服务承诺未在then()中解决



我得到了一个服务,它首先需要检索一个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将与预期的用户对象一起调用,但只有在实际获取数据时才会调用。

最新更新