2016-01-25 2 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.allDataIsLoaded является false

, когда я установил 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 с демонстрацией

Смежные вопросы