到目前为止,我已经使用Restangular对我的API进行了大约4次调用,并且在每一次调用中,我一直在检查它们的第二个参数,如下所示:
Restangular.all("accounts").getList().then(function() {
console.log("All ok");
}, function(response) {
console.log("Error with status code", response.status);
});
正如您所看到的,这不是一种可维护的方法,因为这会在整个应用程序中创建大量重复的错误处理代码。
我知道errorInterceptor存在,但我无法想象它可以用来创建一般错误处理程序。
我希望也许有些新想法可以帮助我解决这个问题。
谢谢:)
答案 0 :(得分:4)
我没有检查我们是否在promise链中有一个特定的错误处理程序,我添加了我的一般错误处理程序,可以在promise链的后面取消:
Restangular.setErrorInterceptor(
function(response, deferred, responseHandler) {
var generalHandlerTimer = $timeout(function(){
generalErrorHanding(response);
},1);
response.cancelGeneralHandler = function(){
$timeout.cancel(generalHandlerTimer);
};
return true; // continue the promise chain
}
);
以及可能发生错误的调用:
restangularizedUser.patch({
user: {
email:newValue
}
}).then(function(res) {
//Success
}, function(response) {
//Error
//Cancel the general error handler due to I want to handle it on my way
response.cancelGeneralHandler();
$log.debug('Handle the ERROR on my specific way');
});
缺点:
response.cancelGeneralHandler();
优势:
答案 1 :(得分:2)
我有类似的问题。 errorInterceptor的问题在于它在任何回调之前被调用,所以我们有一个选项,不仅在我们需要时做一些事情。我以hacky的方式解决了这个问题,因此无论你是否在代码中使用它,都取决于你。工作正常:
"angular": "1.3.0",
"restangular": "1.4.0",
首先我使用errorInterceptor:
RestangularConfigurer.setErrorInterceptor(function (response, deferred, responseHandler) {
var hasSomeErrback = deferred.promise.$$state.pending.map(function (thenAttachment) {
if (thenAttachment[2]) {
return true
}
else {
return false
}
}).reduce(function (accumulator, value) {
return accumulator || value
}, false)
if (!hasSomeErrback) {
myErrorService.globalError()
}
})
但是每次只有在没有注册错误回调时才调用全局错误处理程序(myErrorService.globalError())。这是非常hacky,因为它使用promise对象的内部数据,但似乎工作,请参阅测试:
describe('when server responded with error', function () {
beforeEach(function () {
spyOn(myErrorService, 'globalError')
$httpBackend.whenGET('/api/evil').respond(500, 'pure evil')
})
it('should call global error handler if error callback was NOT attached', function () {
myApiClient.all('evil').getList().then(function () {
})
$httpBackend.flush()
expect(myErrorService.globalError).toHaveBeenCalled()
})
it('shouldnt call global error handler if error callback was attached', function () {
myApiClient.all('evil').getList().then(function () {
}, function () {
console.log('Inside local catch')
})
$httpBackend.flush()
expect(myErrorService.globalError).not.toHaveBeenCalled()
})
it('shouldnt call global error handler if error callback was attached using catch', function () {
myApiClient.all('evil').getList().catch(function () {
})
$httpBackend.flush()
expect(myErrorService.globalError).not.toHaveBeenCalled()
})
})