【发布时间】:2016-03-03 22:47:22
【问题描述】:
我有与外部 API 集成的服务。此 API 不一致,不太可能更改。
API 内部有两种报错方法,一种是使用 HTTP 500 代码响应,另一种是正常的 200 HTTP 响应,但 JSON 中的status 设置为“错误”。
处理 500 错误工作正常,我刚刚使用 responseError 方法创建了拦截器(ngResource 拦截器,而不是 $http 拦截器),当 API 有任何 500 响应时将向用户显示错误消息:
.factory('ApiErrorHandling', ['ngDialog', function(ngDialog) {
return {
responseError: function(response) {
console.log(response);
var error_dialog = ngDialog.open({
template: '/api/error.html',
className: 'error',
preCloseCallback: function() {
if (response.data.status == 'fatal') {
window.location.href = '/';
} else if (response.data.status == 'error') {
var dialogs = ngDialog.getOpenDialogs();
for (var i in dialogs) {
var dialog = dialogs[i];
if (dialog != error_dialog.id) {
ngDialog.close(dialog);
}
}
}
},
data: {
code: response.data.code,
status: response.data.status,
message: response.data.message,
httpCode: response.status,
}
});
},
}
}])
.factory('ApiMethod', ['$resource', 'ApiErrorHandling', function($resource, ApiErrorHandling) {
return $resource('/api/method/', {}, {
query: {method:'POST', interceptor: ApiErrorHandling},
});
}])
但我在处理 status 的错误响应时遇到问题。我不希望在发生错误时调用正常的成功回调(从资源实例传递到方法),我想要一个全局错误处理程序,但到目前为止我没有尝试过任何工作。每次响应都传递给回调。到目前为止我已经尝试过:
- 在
response方法中从拦截器返回 $q.reject - 更改状态码以响应来自拦截器的
response方法内的 500 - 从拦截器更改或删除
response方法中的 response.resource
理想的解决方案是不调用普通回调,而是调用来自拦截器的responseError 方法。
【问题讨论】:
标签: angularjs ngresource