2015-12-03 4 views
0

Мне любопытно, как вы, ребята, делаете обработчик ошибок по умолчанию для всех вызовов $ resource в ваших приложениях angularJS? По-видимому, не имеет смысла отказываться от ошибочной функции обратного вызова для обещания .then(success, faulure) все время, если оно всегда одно и то же. Так что вопрос:Обработчик ошибок по умолчанию в угловых js

  • Вы используете какой-либо обработчик ошибок по умолчанию для всех вызовов службы ресурсов? Как ты это делаешь? Перехватчики?
  • Что делать, если вам нужно сделать собственный обработчик ошибок для одного конкретного вызова службы, скажем, одного из сотни, то как вы переопределите обработчик ошибок по умолчанию перехватчика?

ответ

0

Я предпочитаю использовать HTTP-перехватчик для своих ошибок API. Это довольно простая задача.

Что делать? Поскольку имя говорит, что оно перехватывает каждый ответ, который проходит через HTTP-сервис и, соответственно, службу ресурсов.

Мой подход состоит из двух частей.

Сначала ResponseHandler завод:

app.factory('ResponseHandler', responseHandler); 

responseHandler.$inject = ['$q', '$log']; 

function responseHandler ($q, $log) { 
    return { 
     response: responseHandler, 
     responseError: responseErrorHandler 
    }; 

    function responseHandler (response) { 
     $log.info('HTTP response ', response); 

     // success cases go through here 

     return response; 
    } 

    function responseErrorHandler (rejection) { 
     $log.error('HTTP error ', rejection); 

     // error cases go through here 

     return $q.reject(rejection); 
    } 
} 

и вторая часть, фактическая «активация» в ResponseHandler в поставщике HTTP:

app.config(errorInterceptor); 

errorInterceptor.$inject = ['$httpProvider'] 

function errorInterceptor ($httpProvider) { 
    $httpProvider.interceptors.push('ResponseHandler'); 
} 

Я надеюсь, что этот маленький пример дает понять, как интегрировать его в угловое приложение. В моем случае, например, я обрабатываю большинство случаев ошибок непосредственно в responseErrorHandler, уведомив все приложение с тостами.

В основном я полагаюсь на состояние ошибки (например, 401 или 403), чтобы выполнить специальные действия. Я не знаю, нужно ли вам больше, но я бы посоветовал вам «играть» со статусом и форматом ответов.

Например: Если у вас есть ошибка проверки на стороне сервера в форме, вы, вероятно, не хотите лечить это на этом фундаментальном уровне. Поэтому я отправляю специальную ошибку проверки с кодом состояния 200, который проходит через перехватчик, но затем поймается, как обычно, в .then(..).

+0

Спасибо за ответ. Главный вопрос здесь заключается в том, как включить перехватчик для всех ответов и как переключиться, если выключить для определенных. Мне не нравится, что ваша идея отправляет 200 код статуса для ошибок, потому что в этом случае ваш бэкэнд полагается на архитектуру вашего интерфейса, что неправильно по дизайну. –

+0

Может быть, нужен пример. В моем случае есть некоторые ошибки, как я описал, которые отличаются от общих ошибок API. Я думал, что вы можете быть в аналогичной ситуации, где эта связь имеет смысл. То, что я в конечном счете хотел показать, состоит в том, что вы можете сделать любое условие в errorInterceptor, где вы просто разрешаете ответ, так что он фактически отключен. – FlorianTopf

Смежные вопросы