У меня есть отдельные функции, такие как отправка, обновление, удаление. для всех функций
$http[method](url)
.then(function(response) {
$scope.successMessage = true;
} , function(response) {
$scope.errorMessageWrong=true;
});
HTML
<p ng-show="successMessage">Success</p>
<p ng-show="errorMessageWrong"> Something went wrong </p>
Для отдельных функций. Мне нужно показать соответствующие сообщения. но я не хочу повторять код для обновления, удаления и отправки и даже того же самого для других страниц, которые выполняют ту же операцию. как создать функцию, называемую errorHandler или что-то в этом роде. так что я могу его повторно использовать.
Может кто-нибудь мне помочь
как создать функцию, называемую
errorHandler
или что-то в этом роде. так что я могу его повторно использовать.
Создавайте скрепляемые обещания, возвращаясь для выполнения ответов на данные и отбрасывая отклоненные ответы об ошибках.
В приведенной ниже примерной процедуре в качестве аргумента используется httpPromise, помещается сообщение об успешности или ошибке в области $ scope и возвращается обещание, подходящее для цепочки.
function errorHandler(httpPromise) {
var derivedPromise = httpPromise
.then(function onFulfilled(response) {
$scope.successMessage = true;
//return response for chaining
return response;
},
function onRejected(errorResponse) {
$scope.errorMessageWrong = true;
//throw error to chain rejection
throw errorResponse;
});
//return derivedPromise for chaining
return derivedResponse;
};
Затем в клиентском коде:
var httpPromise = $http[method](url);
errorHandler(httpPromise).then( function (response) {
//use data
});
Клиентский код сохраняет httpPromise из вызова службы $http
, обрабатывает обещание функцией errorHandler
и использует производное обещание, возвращаемое функцией errorHandler
.
Поскольку вызов then
метода обещания возвращает новое производное обещание, легко создать цепочку обещаний. Можно создавать цепочки любой длины, и поскольку обещание может быть разрешено с помощью другого обещания (которое отложит дальнейшее его разрешение), можно приостановить/отложить разрешение обещаний в любой точке цепи. Это позволяет реализовать мощные API. 1
Если вы хотите, чтобы он был глобальным для вашего приложения, вы можете использовать httpInterceptor.
Вы должны создать службу перехватчика, а затем добавить перехватчик в $ httpProvider в свой app.config().
Создайте службу перехватчиков:
angular.module('app').factory('myInterceptorService', myInterceptorService);
function myInterceptorService($q){
var errorMessage;
var bShowHideWatchFlag;
return{
requestError: requestError,
responseError: responseError,
showFlag: bShowFlag,
errorMessage: errorMessage
};
function requestError(rejection){
errorMesasge = 'Request error';
bShowHideWatchFlag = true;
$q.reject(rejection);
return;
}
function responseError(rejection){
errorMesasge = 'Response error';
bShowHideWatchFlag = true;
$q.reject(rejection);
return;
}
}
Чтобы зарегистрироваться в конфигурации приложения, добавьте $ httpProvider в app.config
app.config([...,'$httpProvider'...){
$httpProvider.interceptor.push('myInterceptorService');
}
В вашем контроллере вы должны привязать часы к сервису showFlag:
$scope.$watch( function () { return myInterceptorService.showFlag; },
function (oldval,newval) {
if( oldval!=newval){
$scope.errorMessage = myInterceptorService.errroMessage;
$scope.showMessage = newval;
}
}, true);
Вы можете использовать сервис для этого и делиться в пределах одного контроллера. $ http также является сервисом. Но если вы хотите добавить что-то еще к данным, вы можете создать новую услугу и ввести в нее $ http.
Error: [$injector:undef] Provider 'myInterceptorService' must return a value from $get factory method.