2015-09-20 163 views
0

我在分頁端點上發出GET請求,因此,我正在進行一次調用,找出端點有多少頁,然後遍歷每個頁面,推送響應數據從每個頁面轉換爲一個數組。

但是,由於調用非常大,因此在從我的控制器中獲取此工廠數據時,我需要在我的函數中設置一個超時值,以確保所有數據在使用前都已進入。

我希望能切換到我的工廠的承諾,控制器將等待,直到請求完成。但是由於我正在循環瀏覽每個頁面,所以我通常會構造這種方式不起作用。我怎麼可以重做這個,使承諾等待通過我的終端頁面的完整循環,所以我可以從我的控制器中刪除超時?

廠API GET請求

var productsData = []; 
var pageNumber = 1; 
var getAllProducts = function(){ 
    var deferred = $q.defer(); 
    return $http.get('/api/scroll?page=' + pageNumber,{cache: true}) 
     .then(function(response) { 
      for (var i = response.data.results.length - 1; i >= 0; i--) { 
       productsData.push(response.data.results[i]); 
      }; 
      while (pageNumber <= response.data.pages) { 
       getAllProducts(); 
       pageNumber++; 
      } 
      deferred.resolve(productsData) 
      return deferred.promise; 
     }); 
}; 

控制器功能

var filterProducts; 
    var getProducts = function(type, filter) { 
     productFactory.getAllProducts() 
     .then(function(products) { 
      $timeout(function(){ 
       var allProducts = products; 
       switch (type) { 
        case "category": 
         filterProducts = $filter('filter')(allProducts, { 
          custom: {category_code: filter} 
         }); 
         break; 
        case "color": 
         filterProducts = $filter('filter')(allProducts, { 
          custom: {color_code: filter} 
         }); 
         break; 
        case "season": 
         filterProducts = $filter('filter')(allProducts, { 
          custom: {season: filter} 
         }); 
         break; 
        default: 
         filterProducts = allProducts; 
       } 
       $rootScope.products = _.sortBy(filterProducts, function(product) { 
        return product.custom.sku; 
       }); 
      }, 1000); 
     }); 
    }; 
+0

避免[遞延反模式](http://stackoverflow.com/q/23803743/1048572)! – Bergi

回答

2

您應該創建GET通話功能之外的延期對象,並解決它所有的請求都做了之後。所以,我認爲它可以是這個樣子

var productsData = []; 
 
var pageNumber = 1; 
 
var deferred; 
 

 
function getAllProducts() { 
 
    deferred = $q.defer(); 
 

 
    _getPageProducts(pageNumber); 
 

 
return deferred.promise; 
 
} 
 
function _getPageProducts(pageNumber) { 
 
    $http.get('/api/scroll?page=' + pageNumber,{cache: true}) 
 
     .then(function(response) { 
 
      for (var i = response.data.results.length - 1; i >= 0; i--) { 
 
       productsData.push(response.data.results[i]); 
 
      }; 
 
      if (pageNumber < response.data.pages) { 
 
       pageNumber++; 
 
       _getPageProducts(pageNumber); 
 
      } else { 
 
       deferred.resolve(productsData) ; 
 
      } 
 
     }); 
 
}

+0

令人驚歎 - 謝謝! –

+0

避免[deferred antipattern](http://stackoverflow.com/q/23803743/1048572)! – Bergi

+0

另外,避免全局狀態(在你的'deferred','pageNumber'和'productsData'變量中)! – Bergi