14

在我的 angularjs 应用程序中,我以这种方式为 http 错误定义了一个默认处理程序:

myapp.config([ '$httpProvider', function($httpProvider) {
    $httpProvider.responseInterceptors.push('errorInterceptor')
}])

whereerrorInterceptor是一项服务,它在当前页面顶部的警报字段中显示有关错误的一些详细信息。

现在,当我想以不同的方式处理特定错误时(比如查询是在模式中触发的,并且我想仅在此模式中显示警报,而不是在页面级别):

$http.get('/my/request').then(success, specificErrorHandling)

Angular 会specificErrorHandling触发但仍会触发 my errorInterceptor,因此我的错误会被报告两次。有没有办法避免这种情况?

更一般地说,是否有一种 Angular 方法来仅处理promise链中尚未处理的错误,就像服务器应用程序的顶级错误处理程序不必处理捕获的异常一样?

编辑:根据 Beetroot-Beetroot 在评论中的要求,这是我的拦截器的代码:

@app.factory 'errorInterceptor', [ '$q', 'alertsHandler',
  ($q, alertsHandler) ->
    success = (response) ->
      response

    failure = (response) ->
        alertsHandler.raise(response)

    (promise) ->
      promise.then success, failure
]
4

2 回答 2

5

我们有类似的东西。

如果我们处理 http 错误,我们会在请求上传递一个名为errorHandled:true

$http({
    method: 'GET',
    url: '/my/url',
    errorHandled:true
}).then(function(){ ... }, function(){ ... });

然后在拦截中,responseError: function(rejection){ ... }我们可以通过查看是否设置了此标志rejection.config.errorHandled,如果没有设置 - 然后我们会弹出一个带有错误的 toastr 对话框。代码看起来像这样

function ( rejection ) { 
    if ( !rejection.config.errorHandled && rejection.data.message ){
        toastr.error(rejection.data.message, 'Error');
    }
    return $q.reject(rejection); 
} 

有人在不添加处理程序的情况下编写“errorHandled:true”的可能性很小。有 2 个错误指标的可能性也很小,因为我们已经习惯了 - 但实际上 2 个指标总比没有好。

如果我们承诺查询它是否有错误处理程序或者没有在then链下,那就太好了,但是我们在任何地方都找不到。

于 2015-04-08T12:54:12.880 回答
1

假设您知道需要抑制哪些错误以及需要传播哪些错误。此外,由于 Response 拦截器是一个返回 Promise 本身的函数

您可以捕获失败情况的响应,而不是将其传播到堆栈中,您可以返回诸如空响应之类的内容。

如果您查看拦截器的角度文档中的示例示例

$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
    return function(promise) {
        return promise.then(function(response) {
            // do something on success
        }, function(response) {
            // do something on error
            if (canRecover(response)) {
                return responseOrNewPromise; // This can suppress the error.
            }
            return $q.reject(response); // This propogates it.
        });
    }
});
于 2013-06-23T05:53:14.460 回答