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

时间:2014-06-12 10:24:17

标签: angularjs

我得到的服务首先需要检索一个accessstoken,然后是一个User对象。完成此操作后,需要采取进一步的UI操作。我遇到的问题是使用有效的Session.accesstoken调用login()。then(),但是Session.user是未解析的promise。所以我不能根据用户的信息(例如角色等)来做任何逻辑

以下代码:

在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"));
            }
          });
      },
    };
  })

以下是控制台的输出:

  • 得到了令牌:cf9c0eba82d872508f7dcc0b234f0d52 services.js:120
  • 获取用户......
  • services.js:124获得用户:[object Object]
  • services.js:132以用户身份成功登录 { “标记”: “cf9c0eba82d772508f7dcc0b234f0d52”, “用户”:{ “$承诺”:{}, “$解决”:假}}

1 个答案:

答案 0 :(得分:1)

User对象由$resource创建,并非承诺;它是最终将用用户信息填充的实际对象,但在代码的这一点上它什么都不包含。

解决方案很简单:从第一个then执行:

return User.get({...}).$promise;

下一个then将按预期使用用户对象调用,但仅在实际获取数据时才会调用。