Как написать глобальную функцию для ошибки сервера и успеха в угловых JS

0

У меня есть отдельные функции, такие как отправка, обновление, удаление. для всех функций

$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 или что-то в этом роде. так что я могу его повторно использовать.
Может кто-нибудь мне помочь

Теги:
server
global

3 ответа

1
Лучший ответ

как создать функцию, называемую 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

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);
  • 0
    Я получил эту ошибку в консоли Error: [$injector:undef] Provider 'myInterceptorService' must return a value from $get factory method.
0

Вы можете использовать сервис для этого и делиться в пределах одного контроллера. $ http также является сервисом. Но если вы хотите добавить что-то еще к данным, вы можете создать новую услугу и ввести в нее $ http.

  • 0
    можете ли вы показать мне, как написать сервис для него

Ещё вопросы

Сообщество Overcoder
Наверх
Меню