2016-01-25 48 views
2

我有這樣的功能:AngularJS:如何調用具有延遲的遞歸函數?

$scope.getContactsByScroll = function() { 
    $scope.pageN = $scope.pageN + 1; 
    if (!$scope.allDataIsLoaded){ 
    fetchMyDataService.getContactsByScrollService($scope.pageN).then(function(response) { 
     if (response.length === 0){ 
     $scope.allDataIsLoaded = true; 
     } 
     else if (response.length !== 0 && !$scope.allDataIsLoaded){ 
     angular.forEach(response, function(el) { 
      $scope.contacts.push(el); 
     }); 
     //$timeout(function() { 
      $scope.getContactsByScroll(); 
     //}, 2000); 
     } 
    }).catch(function() { 
     $scope.allDataIsLoaded = true; 
    }); 
    } 
}; 

,但稱自己幾次甚至,如果$scope.allDataIsLoadedfalse

當我設置timeout:像一個魅力的所有的作品。但我不認爲這是一個好的解決方案。如何在不超時的情況下延遲我的功能?

+0

爲什麼你認爲$超時是不是一個好的解決方案嗎?這對我來說似乎是最合乎邏輯的解決方案。 –

+3

超時是一個很好的解決方案... – Neron

回答

0

在異步函數使用超時是不是一個好主意:

  1. 如果您的請求時間較長然後超時,那麼你會得到不必要的請求。

  2. 如果您的超時時間大於請求時間,那麼您將得到不必要的滯後。

您應該對請求性請求使用承諾鏈。嘗試是這樣的:

var asyncService = function ($timeout) 
    { 
     var someData = 10; 
     var service = 
      { 
       FetchData: function (someArray) 
       { 
        someData++; 
        //timeout here is just for demonstration of async request 
        return $timeout(function() { return someData }, 1000) 
         .then(function (result) 
         { 
          return service.ProcessData(result, someArray); 
         }); 
       }, 
       ProcessData: function (data, someArray) 
       { 
        console.log(data); 
        if (data == 15) 
        { 
         return someArray; 
        } 
        else 
        { 
         someArray.push(data) 
         return service.FetchData(someArray); 
        } 
       } 
      }; 
     return service; 
    } 

這裏有一個plunker與示範