2014-06-17 3 views
1

내 AngularJS 응용 프로그램에 데이터를 제공하는 서비스를 만들었습니다. 다소 단순하지만 서비스에는 $http 호출을하는 메서드가 많이 포함되어 있습니다. 문제는이 호출이 뷰의 HTML 항목 (제품 세부 정보 부분)이 뷰 포트에 표시 될 때마다 만들어 지므로 (사용자가 느린 로딩 인 경우) 사용자가 맨 아래로 똑바로 스크롤 할 수 있습니다. 페이지 및 기타 요청을 (일반적으로 약 50-60) 차단/기타 전체 또는 응용 프로그램을 차단할 것입니다 요청을 만듭니다. 따라서 요청을 제한, 제한, 대기 또는 지연하는 방법이 필요합니다. 큐잉이 가장 좋지만 당분간은 서비스의 요청 양을 제한/관리 할 것입니다.AngularJS 서비스의 HTTP 요청 제한 또는 지연

productAvailabilityService.getAvailability(scope.productId).then(function (result) { 
    // do stuff with the result... 
}); 

을하고이

.factory('productAvailabilityService', function ($http) { 

     var prodAv = {}; 
     prodAv.getAvailability = function (productId) {   
       return $http({ 
        method: 'GET', 
        url: '/api/product/getAvailability', 
        params: { 
         'productId': productId 
        } 

       }).then(
        function (response) { 
         return response; 
        }, function() { 
         return 0; 
        }); 
      } 
     }; 

     return prodAv; 
    }); 

지금 내가 그렇게처럼 ... 제한 기능을 추가 할 서비스 :

이것은 내 컨트롤러/지침 내 서비스를 호출하는 방법입니다 :

.factory('productAvailabilityService', function ($http) { 

    var prodAv = {}; 
    prodAv.requests = 0; 

    prodAv.getAvailability = function (productId) { 

     if (prodAv.requests > 6) { 
      return function() { 
       return 'Too many requests'; 
      }; 
     } else { 

      prodAv.requests++; 
      return $http({ 
       method: 'GET', 
       url: '/api/product/:productId/getAvailability', 
       params: { 
        'productId': productId 
       } 

      }).then(
       function (response) { 
        prodAv.requests--; 
        return response; 
       }, function() { 
        prodAv.requests--; 
        return 0; 
       }); 
     } 
    }; 

    return prodAv; 
}); 

이렇게하면 요청 수가 6 개를 초과하면 오류가 발생합니다. .getAvailability(...).then is not a function 나는 고칠 수있을 것 같지 않다, 내가 뭘 잘못하고 있는지 알 수 ... 또한이 방법은 조금 틀린 것 같습니다, 서비스의 시간을 관리 할 수있는 더 나은 방법입니다/$http 요청을 실행 하시겠습니까? 미리 감사드립니다! 사용자가 당신은 productAvailabilityService에 대한 약속을 사용할 필요가

var timer; 
function getData(){ 
      $timeout.cancel(timer); 
      timer=$timeout(function(){ 
       $http.get(url) 
      },200); 
} 
+0

아마도 귀하의 접근 방식이 적합하지 않을 수 있습니다. 예를 들어 각 요청에서 여러 항목을 가져 와서 요청 수를 줄일 수 있습니다. 물론 응답 시간은로드 시간에 눈에 띄는 영향을주지 않으면 서 더 커지 겠지만, 내가 보는 곳에서 요청 횟수를 줄이는 것이 그보다 더 중요합니다. 동시에 어떤 종류의 제한을 설정하는 것은 좋은 생각이지만, 얼마나 엄격한가에 따라 구현할 수있는 방법은 여러 가지가 있습니다 (즉, 클라이언트 측에서도 수행 할 수 있습니다). –

답변

1

같은 요청 뭔가를 실행하기 전에 원하는 내용을 도착할 때까지

+0

그건 대단합니다. 답변을 주셔서 감사합니다. 나는 정말로 약속을 잘 이해하고 있습니다. 그러나 productAvailabilityService.getAvailability (...)는 컨트롤러 (서비스가 아님)에서 정의되지 않았습니다. –

+0

새로운 productAvailabilityService 소스에 문법 오류가있어 각도가 생기지 않습니다 그것을 컨트롤러에 주입하는 것. 나는 어디서 오류인지 알지 못한다. – pdem

+0

console.log를 사용할 때 $ q.promise를 반환합니다. 정의되지 않았습니까? 내가 반환 deferred.promise을 반환해야합니까? –

0

나는 시간 간격을 설정하고 기다릴 것입니다. 당신은 어쩌면 수

.factory('productAvailabilityService', function ($http,$q) { 

var prodAv = {}; 
prodAv.requests = 0; 

prodAv.getAvailability = function (productId) { 

    if (prodAv.requests > 6) { 
     var deferred = $q.defer(); 
     deferred.reject("no more than 6 calls"); 
     return deferred.promise; 
    }else{ //etc. 

: 현재

가 약속 코드의 일부입니다 .. 대신 약속 함수를 반환, 그래서 "다음()"첫 번째 줄의 코드에서 오류가 발생 또한 지연된 전화를 관리하는 경우 해결 기능을 사용하십시오.