2016-12-05 70 views
0

我试图将currentUser对象存储在工厂中,以便可以在我的应用程序中访问它。但是,只要我调用CurrentUserFactory.GetCurrentUser(),它就会返回null。我已经验证过,一切都很好,服务器端正在接收用户对象。但它总是返回null。角度工厂函数总是返回空

angular.module('myWebApp.services') 
    .factory('CurrentUserFactory', ['SettingsFactory', '$http', function(SettingsFactory, $http) { 
      var CurrentUserFactory = {}; 
      var currentUser = null; 

      CurrentUserFactory.GetCurrentUser = function() { 
       if (!currentUser) { 
        $http.get(SettingsFactory.myAPIUrl + 'api/users/current', { withCredentials: true }).then(function (response) { 
         currentUser = response.data; 
        }); 
       } 
       return currentUser; 
      } 

      return CurrentUserFactory; 
     } 
    ]); 
+1

这是一个AJAX调用 - 你不能从它返回 - 哟你需要使用承诺或回调。 – tymeJV

+0

您可以使用对象初始化您的'currentUser',然后将所有响应字段复制到该对象。然后你会得到最终用户。 –

+0

@tymeJV'.then'不是承诺吗? – Legion

回答

3

$http异步调用返回一个承诺,但函数本身返回currentUser,这是null。您需要返回$http承诺,如果currentUsernull,或返回currentUser包裹在一个承诺,如果它不是null

angular.module('myWebApp.services') 
    .factory('CurrentUserFactory', ['SettingsFactory', '$http', '$q', function(SettingsFactory, $http, $q) { 
      var CurrentUserFactory = {}; 
      var currentUser = null; 

      CurrentUserFactory.GetCurrentUser = function() { 
       if (!currentUser) { 
        return $http.get(SettingsFactory.myAPIUrl + 'api/users/current', { withCredentials: true }).then(function (response) { 
         currentUser = response.data; 
         return response.data; 
        }); 
       } 
       return $q.resolve(currentUser); 
      } 

      return CurrentUserFactory; 
     } 
    ]); 

用法:

因为该函数返回一个承诺,你需要一个.then()块得到结果:

CurrentUserFactory.GetCurrentUser().then(function(currentUser) { 
    console.log(currentUser); 
}); 
+0

或'return Promise.resolve(currentUser)'而不是'$ q'依赖关系 –

+0

它的角度$ q是框架的一部分,它也调用apply,角度2方式绑定依赖于。 –

+0

我发现丑陋的承诺。是否可以像这样使用'GetCurrentUser'来实现这个功能:'var cu = CurrentUserFactory.GetCurrentUser();'? – Legion