AngularJS:如何通过延迟调用递归函数?

时间:2016-01-25 14:19:10

标签: javascript angularjs promise

我有这样的功能:

$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时:一切都像魅力一样。但我不认为这是一个很好的解决方案。如何在没有超时的情况下延迟我的功能?

1 个答案:

答案 0 :(得分:0)

在异步函数中使用超时不是一个好主意:

  1. 如果您的请求时间超过了超时,那么您将收到不必要的请求。

  2. 如果您的超时时间大于请求时间,那么您将获得不必要的延迟。

  3. 您应该使用保证链来获取请求。尝试这样的事情:

    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