2016-12-13 2 views
0

나는 http 요청을 수행하는 컨트롤러가 있습니다.
이 요청은 일부 데이터를 반환하는 데 2 ​​초에서 4 분까지 걸릴 수 있습니다.
검색을 완료하는 데 너무 오래 걸리면 사용자가 요청을 취소해야하는 버튼을 추가했습니다.각도 서비스 약속 취소

컨트롤러 :

$scope.search = function() { 
    myFactory.getResults() 
     .then(function(data) { 
     // some logic 
     }, function(error) { 
     // some logic 
    }); 
} 

서비스 :

var myFactory = function($http, $q) { 
    return { 
     getResults: function(data) { 
      var deffered = $q.dafer(); 
      var content = $http.get('someURL', { 
       data: {}, 
       responseType: json 
      )} 

      deffered.resolve(content); 
      returned deffered.promise; 
     } 
    } 
} 

버튼 클릭 :

$scope.cancelGetResults = function() { 

    // some code to cancel myFactory.getResults() promise 

} 

가 어떻게 impleme 수 버튼을 클릭하면 myFactory.getResults() 약속을 취소 할 수 있습니까?

+0

** 수동 ** 취소가 필요하거나 시간 제한이있는 항목이 필요합니까? – Mistalis

+0

@Mistalis - 사용자가 요청 시간 초과를 기다리거나 취소를 클릭 할 수 있으므로 수동으로 –

+0

[AngularJS에서 $ http 요청을 취소하는 방법?] (http://stackoverflow.com/questions/13928057/how -to-cancel-an-http-request-in-angularjs) – Liam

답변

0

사용할 수있는 .resolve() 메서드를 사용할 수 있습니다.

컨트롤러의 약속을 변수에 전달하십시오.

예 : 공장에서 인수로 약속을 취하는 취소 방법. 그런 다음 컨트롤러의 cancelGetResults() 함수에서이 메서드를 호출합니다.

취소 방법에서는 전달 된 약속에서 .resolve를 호출하기 만하면됩니다.

실제로 수행해야합니다.

https://www.bennadel.com/blog/2731-canceling-a-promise-in-angularjs.htm

+0

링크가 작동하지 않습니다. – Mistalis

+0

그것은 무엇입니까? 그것은 나를 위해 잘 작동 ... 같은 문제가 누구 있습니까? –

1

문제는 일반적으로 피해야한다 deferred antipattern을 사용하지만 취소의 경우에 맞는 :

getResults: function(data) { 
    var deffered = $q.defer(); 

    $http.get('someURL', { 
     data: {}, 
     responseType: json 
    }).then(deffered.resolve, deferred.reject); 

    deffered.promise.cancel = function() { 
     deferred.reject('CANCELLED') 
    }; 

    returned deffered.promise; 
} 
+0

그러나 이것에 대해 고마워, 내가 어떻게 $ scope.cancelGetResults이 함께 사용할 수있는 이해 못 하겠어 ?? –

+1

'$ scope.search' 메소드의'$ scope.resultsPromise = myFactory.getResults (...)'와 같은 것입니다. 그리고 $ scope.cancelGetResults 메소드에서'if ($ scope.resultsPromise) $ scope.resultsPromise.cancel()'를 호출합니다. – estus

+0

위의 방법을 시도해 보았지만 제대로 작동하지 않는 것 같습니다. "정의되지 않은 속성 'cancel'을 읽을 수 없습니다."plunker를 제공하십시오. –

1

getResult를 우리가 취소를 구현하는 서비스입니다.

getResult = function(){ 
var deferred = $q.defer(); 
$http.get(url).success(function(result){ 
    deffered.resolve(result); 
}).error(function(){ 
deffered.reject('Error is occured!'); 
}); 
return deferred.promise; 
}; 

안정적인 API URL 대신 url 변수가 사용됩니다. 주어진 코드와 함께 사용할 수 있습니다.

getResult().then(function (result) { console.log(result); };