2016-12-05 50 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