我们有API在响应XML中返回错误,而不是拒绝它们并发送错误响应。 所以我有以下代码来处理它们,
$http({
url: apiURL,
method: "POST",
data: req,
headers: oHeaders,
dataType: "xml",
})
.success(function(data,status) {
console.log('success!!!!!');
deff.resolve(data);
})
.error(function(data,status) {
console.log('This is what I want to see!!!!!');
deff.reject(data);
});
myApp.factory('customHttpInterceptor', ['$q', function ($q) {
return function (promise) {
return promise.then(function (response) {
var parsed;
if (response.config.dataType == 'xml'){
parsed = $.xml2json(response.data);
if (parsed) {
angular.forEach(parsed, function(v, k) {
if (k == 'status') {
if (v.APIErrors) {
return $q.reject(response);
}
}
});
}
console.log(parsed);
}
return response;
}, function (errResponse) {
// do something on error
console.log('Error section in interceptor');
return $q.reject(errResponse);
});
};
}]);
我期望得到的是,当拦截器中发现错误时,它将拒绝承诺,控件将进入$ http的错误部分并记录"这就是我想要的见!!!!!"信息。但相反是显示"成功!!!!!"信息。
这是它的工作方式还是我做错了什么?
的Ish
答案 0 :(得分:1)
我看到一些看似错误的事情:
在forEach
angular.forEach(parsed, function(v, k) {
if (k == 'status') {
if (v.APIErrors) {
return $q.reject(response);
}
}
});
你可能写过这个,因为你习惯将return
语句放在for循环中。这在这里不起作用,因为你从函数体内部返回。 从不 有任何理由在forEach
正文函数中返回内容:此值不会被任何内容使用。
Angular Interceptor API
也许你只是没有在你的代码中显示它,但你必须注册你的拦截器。
$httpProvider.interceptors.push('customHttpInterceptor');
更重要的是,你的拦截器没有正确的形式:在你的情况下,它应该是一个带有response
方法的对象,它返回响应响应的承诺。