Saya melakukannya seperti yang disarankan Bradley Braithwaite di blognya :
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;
});
}])
Poin Utama:
Fungsi penyelesaian terhubung ke fungsi. Lalu di pengontrol kami yaitu semuanya baik-baik saja, jadi kami dapat menepati janji kami dan menyelesaikannya.
Fungsi penolakan menautkan ke fungsi .catch di pengontrol kami yaitu ada yang tidak beres, jadi kami tidak bisa menepati janji kami dan harus menolaknya.
Ini cukup stabil dan aman dan jika Anda memiliki kondisi lain untuk menolak janji, Anda selalu dapat memfilter data Anda dalam fungsi sukses dan memanggil deferred.reject(anotherReason)
dengan alasan penolakan.
Seperti yang disarankan Ryan Vice di komentar , ini mungkin tidak terlihat berguna kecuali Anda sedikit mengutak-atik responsnya.
Karena success
dan error
tidak digunakan lagi sejak 1.4 mungkin lebih baik menggunakan metode janji reguler then
dan catch
dan mengubah respons di dalam metode tersebut dan mengembalikan promise dari respons yang diubah itu.
Saya menunjukkan contoh yang sama dengan kedua pendekatan dan pendekatan ketiga di antara:
success
dan error
pendekatan ( success
dan error
mengembalikan janji respons HTTP, jadi kami membutuhkan bantuan $q
untuk mengembalikan janji data):
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
dan catch
pendekatan (ini sedikit lebih sulit untuk diuji, karena lemparan):
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;
}
Namun ada solusi setengah jalan (dengan cara ini Anda dapat menghindari throw
dan bagaimanapun Anda mungkin perlu menggunakan $q
untuk mengejek perilaku janji dalam pengujian Anda):
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;
}
Segala jenis komentar atau koreksi dipersilakan.
success()
,error()
danfinally()
dikombinasikan dengancatch()
? Atau apakah saya harus menggunakanthen(successFunction, errorFunction).catch(exceotionHandling).then(cleanUp);