angularjs ajax拦截器,关于angularjs:使用拦截器处理200 HTTP响应上的错误

我有与外部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

响应拦截器中的500个response方法更改状态代码

从拦截器更改或删除response方法中的response.resource

理想的解决方案是不调用常规回调时,而是调用拦截器的responseError方法。

But I have problem with handling error responses with status. I don't want normal success callback (passed into method from resource instance) to be called when error occurs, I want one global error handler, but nothing I've tried so far worked. Each time response is passed into callback. I've tried so far:

returning $q.reject in response method from interceptor

要拒绝您不喜欢的回复,请使用throw:

function inteceptor(httpPromise) {

var newPromise = (httpPromise

.then(function(response) {

if (dontLike) {

throw response;

} else {

return response;

},

function (eResponse) {

if (iLike) {

return eResponse;

} else {

throw eResponse;

};

})

);

return newPromise;

};

从拦截器链接

var chainedPromise = (interceptor(httpPromise)

.then (function (response) {

//render data

return response;

}).catch (function (error) {

console.log(error);

throw error;

})

);

我如何捕捉该抛出的错误?

我找到了解决方案。 我认为是ngResource模块中的一些错误。

当这样注册回调时:

ApiMethod.query({'get_parameter': 1}, {'post_json': 2}, function(result) {

something...

});

防止调用回调的唯一解决方案是从ngResource拦截器抛出错误。 但是当在promise中注册回调时:

ApiMethod.query({'get_parameter': 1}, {'post_json': 2}).$promise.then(function(result) {

something...

});

仅从拦截器返回$q.reject即可阻止调用回调。

重写所有回调注册可解决此问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值