Angular:未处理http错误的默认处理程序
Angular: Default handler for unhandled http errors
在我的angularjs应用程序中,我以这种方式定义了http错误的默认处理程序:
myapp.config([ '$httpProvider', function($httpProvider) {
$httpProvider.responseInterceptors.push('errorInterceptor')
}])
其中errorInterceptor
是在当前页面顶部的警报字段中显示有关错误的一些详细信息的服务。
现在,当我想用不同的方式处理特定错误时(比如查询是在模式中触发的,我想只在该模式中显示警报,而不是在页面级别):
$http.get('/my/request').then(success, specificErrorHandling)
Angular执行specificErrorHandling
,但仍然触发我的errorInterceptor
,所以我的错误被报告了两次。有办法避免这种情况吗?
更一般地说,是否有一种Angular方法可以只处理promise
链中尚未处理的错误,就像服务器应用程序的顶级错误处理程序不必处理捕获的异常一样?
编辑:根据甜菜根在评论中的要求,这是我的拦截器的代码:
@app.factory 'errorInterceptor', [ '$q', 'alertsHandler',
($q, alertsHandler) ->
success = (response) ->
response
failure = (response) ->
alertsHandler.raise(response)
(promise) ->
promise.then success, failure
]
我们有这样的东西。
如果我们处理http错误,我们会在请求上传递一个名为errorHandled:true
的属性
$http({
method: 'GET',
url: '/my/url',
errorHandled:true
}).then(function(){ ... }, function(){ ... });
然后在responseError: function(rejection){ ... }
的截距中,我们可以通过查看rejection.config.errorHandled
来查看是否设置了该标志,如果没有,则我们弹出一个带有错误的toast对话框。代码看起来像这个
function ( rejection ) {
if ( !rejection.config.errorHandled && rejection.data.message ){
toastr.error(rejection.data.message, 'Error');
}
return $q.reject(rejection);
}
有人写"errorHandled:true"而不添加处理程序的可能性很小。有两个错误指标的可能性也很小,因为我们已经习惯了——但实际上有两个指标总比没有好。。
如果我们承诺查询它是否有错误处理程序或是否在then
链中,那就太好了,但我们在任何地方都找不到它。
假设您知道哪些错误需要抑制,哪些错误需要传播。此外,由于响应拦截器是一个返回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.
});
}
});
- 是否存在添加两个相同事件处理程序的默认行为
- 将事件处理程序放在HTML按钮上,而不覆盖其默认功能
- $q:默认拒绝处理程序
- 如何在更改的事件处理程序中忽略Polymer元素上默认属性的初始覆盖
- JavaScript:将所有事件处理程序重置为默认值/禁用自定义处理程序
- 处理Ember.js默认路由之外的页面URL哈希参数
- Jquery OOP 模型阻止默认然后调用基处理程序
- 如何正确处理空的、遗漏的、默认的表单值
- 有没有更好的方法来处理默认 true
- 在 Javascript 中,如何从父事件处理程序中防止子元素的默认
- JS:如何防止中键的默认处理
- 我们可以只使用“if (a === undefined)”来处理 ES6 之前的 JavaScript 中的默认参数值吗
- 通过javascript处理默认配置文件图像的更好方法
- JavaScript:处理默认值为true的函数参数
- 如何将事件处理程序绑定到Google Maps V3 API默认PanControl's单击事件
- angular js中的默认错误处理程序
- Angular:自定义事件处理程序的顺序&默认处理程序
- Angular:未处理http错误的默认处理程序
- 从jQuery处理程序中获取事件默认处理程序的结果
- 使用javascript代替浏览器的CTR + n默认处理程序