Tôi làm điều đó như Bradley Braithwaite gợi ý trong blog của anh ấy :
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;
});
}])
Những điểm chính:
Hàm giải quyết liên kết với hàm .then trong bộ điều khiển của chúng tôi, tức là tất cả đều ổn, vì vậy chúng tôi có thể giữ lời hứa và giải quyết nó.
Hàm từ chối liên kết với hàm .catch trong bộ điều khiển của chúng tôi, tức là đã xảy ra lỗi, vì vậy chúng tôi không thể giữ lời hứa của mình và cần phải từ chối nó.
Nó khá ổn định và an toàn và nếu bạn có các điều kiện khác để từ chối lời hứa, bạn luôn có thể lọc dữ liệu của mình trong hàm thành công và gọi deferred.reject(anotherReason)
với lý do từ chối.
Như Ryan Vice đã đề xuất trong các bình luận , điều này có thể không được coi là hữu ích trừ khi bạn thử một chút với phản hồi, có thể nói.
Vì success
và error
đang bị phản đối từ 1,4 có thể nó là tốt hơn để sử dụng các phương pháp hứa hẹn thường xuyên then
và catch
và chuyển đổi các phản hồi trong vòng các phương pháp đó và gửi lại lời hứa đó phản ứng chuyển đổi.
Tôi đang đưa ra cùng một ví dụ với cả hai cách tiếp cận và cách tiếp cận thứ ba ở giữa:
success
và error
cách tiếp cận ( success
và error
trả về một lời hứa về phản hồi HTTP, vì vậy chúng tôi cần sự trợ giúp của $q
việc trả lại lời hứa về dữ liệu):
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
và catch
cách tiếp cận (điều này khó kiểm tra hơn một chút, vì quá khó):
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;
}
Tuy nhiên, có một giải pháp nửa chừng (bằng cách này, bạn có thể tránh throw
và dù sao thì bạn có thể sẽ cần phải sử dụng $q
để chế nhạo hành vi hứa hẹn trong các thử nghiệm của mình):
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;
}
Mọi loại nhận xét hoặc sửa chữa đều được hoan nghênh.
success()
,error()
vàfinally()
kết hợp vớicatch()
? Hay tôi phải sử dụngthen(successFunction, errorFunction).catch(exceotionHandling).then(cleanUp);