2016-03-22 45 views
1

我已經在我的AngularJS應用程序中創建了一個工廠,用於在對服務器的一個或多個元素執行刪除之後從服務器中引入刷新的數據列表。

var myApp = angular.module('app'); 
myApp.factory('mvListRefresher', function($http) { 
    return { 
     refreshCourses : function() { 
      var list = new Array(); 
      $http.get('/api/courses').then(function(response) { 
       console.log('got refreshed lists'); 
       console.log(response.data); 
       list = response.data; 
      }, function(error) { 
       console.log('error in retreiving fresh lists'); 
       console.log(error); 
      }); 

      console.log('Displaying list of courses'); 
      console.log(list); 
      if(list.length != 0) { 
       return list; 
      } 
     } 
    } 
}); 

我通過調用

$scope.courses = mvListRefresher.refreshCourses(); 

調用這個廠我的控制器之一,但我得到一個空列表,即我沒有得到任何回報價值可言。在我廠的功能我觀察到線

console.log(list); 

總是打印出一個空數組,但是行

console.log(response.data); 

這是成功回調版畫內而外對象的完整列表正確。我不知道這是如何發生的。我對AngularJS的承諾相對陌生,它是異步的方法和架構。請幫助我。如果您需要更多信息,我會提供。我已經使用MEAN完成了整個應用程序。提前致謝!

回答

3

$http請求本質上是異步的,因此在返回list時,請求尚未完成。您可以在此響應閱讀更多關於異步的JavaScript中的基本概念:https://stackoverflow.com/a/14220323/704894

你應該做的,而不是爲返回列表的承諾:

myApp.factory('mvListRefresher', function($http) { 
    return { 
     refreshCourses: function() { 
      return $http.get('/api/courses').then(function(response) { 
       return response.data; 
      }); 
     } 
    }; 
}); 

$http方法返回結果的承諾。然後,您可以通過以下方式使用此功能:

mvListRefresher.refreshCourses().then(function (list) { 
    $scope.courses = list; 
}); 

你應該閱讀更多關於它在$http documentation