나는 Bradley Braithwaite가 그의 블로그 에서 제안한 것처럼 그것을합니다 .
app
.factory('searchService', ['$q', '$http', function($q, $http) {
var service = {};
service.search = function search(query) {
// We make use of Angular's $q library to create the deferred instance
var deferred = $q.defer();
$http
.get('http://localhost/v1?=q' + query)
.success(function(data) {
// The promise is resolved once the HTTP call is successful.
deferred.resolve(data);
})
.error(function(reason) {
// The promise is rejected if there is an error with the HTTP call.
deferred.reject(reason);
});
// The promise is returned to the caller
return deferred.promise;
};
return service;
}])
.controller('SearchController', ['$scope', 'searchService', function($scope, searchService) {
// The search service returns a promise API
searchService
.search($scope.query)
.then(function(data) {
// This is set when the promise is resolved.
$scope.results = data;
})
.catch(function(reason) {
// This is set in the event of an error.
$scope.error = 'There has been an error: ' + reason;
});
}])
키 포인트:
resolve 함수는 컨트롤러의 .then 함수에 연결됩니다. 즉 모든 것이 정상이므로 약속을 지키고 해결할 수 있습니다.
reject 함수는 컨트롤러의 .catch 함수에 연결됩니다. 즉, 무언가 잘못되었으므로 약속을 지킬 수없고 거부해야합니다.
매우 안정적이고 안전하며 약속을 거부 할 다른 조건이있는 경우 언제든지 성공 함수에서 데이터를 필터링 deferred.reject(anotherReason)
하고 거부 이유를 호출 할 수 있습니다 .
Ryan Vice가 의견에서 제안했듯이 답변을 조금만 조작하지 않으면 유용하지 않을 수 있습니다.
때문에 success
그리고 error
1.4부터 사용되지 않습니다 어쩌면 정규 약속 방법을 사용하는 것이 좋습니다 then
및 catch
그 방법 내에서 응답을 변환하고 변환 응답의 약속을 반환합니다.
두 가지 접근 방식과 세 번째 중간 접근 방식으로 동일한 예를 보여줍니다.
success
및 error
접근 ( success
그리고 error
HTTP 응답 $q
의 약속을 반환하므로 데이터 약속을 반환하는 데 도움이 필요합니다 ) :
function search(query) {
// We make use of Angular's $q library to create the deferred instance
var deferred = $q.defer();
$http.get('http://localhost/v1?=q' + query)
.success(function(data,status) {
// The promise is resolved once the HTTP call is successful.
deferred.resolve(data);
})
.error(function(reason,status) {
// The promise is rejected if there is an error with the HTTP call.
if(reason.error){
deferred.reject({text:reason.error, status:status});
}else{
//if we don't get any answers the proxy/api will probably be down
deferred.reject({text:'whatever', status:500});
}
});
// The promise is returned to the caller
return deferred.promise;
};
then
그리고 catch
접근 (이것은 던지기 때문에 테스트하기가 조금 더 어렵습니다) :
function search(query) {
var promise=$http.get('http://localhost/v1?=q' + query)
.then(function (response) {
// The promise is resolved once the HTTP call is successful.
return response.data;
},function(reason) {
// The promise is rejected if there is an error with the HTTP call.
if(reason.statusText){
throw reason;
}else{
//if we don't get any answers the proxy/api will probably be down
throw {statusText:'Call error', status:500};
}
});
return promise;
}
그래도 중간 해결책이 있습니다 (이렇게하면 피할 수 throw
있고 어쨌든 $q
테스트에서 promise 동작을 모의하는 데 사용해야 할 것입니다 ).
function search(query) {
// We make use of Angular's $q library to create the deferred instance
var deferred = $q.defer();
$http.get('http://localhost/v1?=q' + query)
.then(function (response) {
// The promise is resolved once the HTTP call is successful.
deferred.resolve(response.data);
},function(reason) {
// The promise is rejected if there is an error with the HTTP call.
if(reason.statusText){
deferred.reject(reason);
}else{
//if we don't get any answers the proxy/api will probably be down
deferred.reject({statusText:'Call error', status:500});
}
});
// The promise is returned to the caller
return deferred.promise;
}
어떤 종류의 의견이나 수정도 환영합니다.
success()
하고error()
와finally()
결합catch()
하시겠습니까? 아니면 사용해야합니까then(successFunction, errorFunction).catch(exceotionHandling).then(cleanUp);