Bradley Braithwaite'in blogunda önerdiği gibi yapıyorum :
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;
});
}])
Anahtar noktaları:
Çözümleme işlevi, denetleyicimizdeki .then işlevine bağlanır, yani her şey yolunda, böylece sözümüzü tutabilir ve çözebiliriz.
Reddetme işlevi, denetleyicimizdeki .catch işlevine bağlanır, yani bir şeyler ters gitti, bu yüzden sözümüzü tutamayız ve onu reddetmemiz gerekir.
Oldukça kararlı ve güvenlidir ve sözü reddetmek için başka koşullarınız varsa, başarı işlevindeki verilerinizi her zaman filtreleyebilir deferred.reject(anotherReason)
ve reddedilme nedeni ile arama yapabilirsiniz .
Ryan Vice'in yorumlarda önerdiği gibi, tabiri caizse yanıtla biraz uğraşmadığınız sürece bu yararlı olarak görülmeyebilir.
Çünkü success
ve error
1.4'ten beri kullanımdan kaldırılıyor belki de normal vaat yöntemlerini kullanmak daha iyidirthen
ve catch
ve bu yöntemlerin içinde yanıt dönüşümü ve bu dönüştürülmüş tepkinin sözünü geri dönün.
Her iki yaklaşımla ve arada üçüncü bir yaklaşımla aynı örneği gösteriyorum:
success
ve error
yaklaşın ( success
ve error
bir HTTP yanıtı vaadini verin, bu nedenle $q
bir veri vaadini döndürmek için yardıma ihtiyacımız var ):
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
ve catch
yaklaşma (atış nedeniyle bunu test etmek biraz daha zordur):
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;
}
Yine de yarım bir çözüm var (bu şekilde kaçınabilirsiniz throw
ve yine de muhtemelen $q
testlerinizde vaat edilen davranışla dalga geçmek için kullanmanız gerekecek ):
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;
}
Her türlü yorum veya düzeltmeye açığız.
success()
,error()
vefinally()
kombinecatch()
? Yoksa kullanmak zorunda mıyımthen(successFunction, errorFunction).catch(exceotionHandling).then(cleanUp);