角度js中的默认错误处理程序

时间:2015-12-03 20:39:01

标签: javascript angularjs

我很好奇你们如何为angularJS应用程序中的所有$ resource服务调用制作默认错误处理程序?显然,如果始终保持一致,则为promise .then(success, faulure)提供错误的函数回调是没有意义的。所以问题是:

  • 您是否为所有资源服务调用使用某种默认错误处理程序?你怎么做到的?拦截器?
  • 如果您需要为一个特定的服务调用创建自定义错误处理程序,比如百分之一,那么如何覆盖拦截器的默认错误处理程序呢?

1 个答案:

答案 0 :(得分: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);
    }
}

和第二部分,HTTP提供程序中ResponseHandler的实际“激活”:

app.config(errorInterceptor);

errorInterceptor.$inject = ['$httpProvider']

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

我希望这个小例子能够清楚地说明如何将它集成到一个角度应用程序中。在我的例子中,我直接在responseErrorHandler处理大部分错误案例,通过toast通知整个应用程序。

我主要依靠错误状态(例如401或403)来进行特殊操作。我不知道你是否需要更多,但我建议你“玩”状态代码和响应格式。

例如:如果表单中存在服务器端验证错误,您可能不希望在此基础级别处理此错误。所以我发送了一个特殊的验证错误,状态代码为200,它通过拦截器,然后像往常一样在.then(..)中被捕获。