我正在使用AngularJS和Restangular来访问API。我有一个包装我的API调用的服务。在我的服务函数中,我想处理Restangular本机错误和应用程序逻辑错误。我应该在$ q延迟层中包装我的Restangular承诺吗?
如何捕捉(1)中产生的错误并在(2)中显示?
我的服务如下:
app.service("project", function(Restangular) {
var projectObj = {
list : function() {
...
return 0;
},
generate : function() {
var list = projectObj.list();
if (list == 0) {
throw 'Empty list returned'; // (1)
}
else {
var promise = Restangular.one('project').get().then( function( returnedProject) {
console.log("returned", returnedProject);
}, function() {
console.log('there was an error');
};
return promise;
}
}
};
return projectObj;
}
使用该服务的控制器:
var projectViewCtrl = function ($scope, project, notify) {
openGenerate = function() {
$scope.project.generate().then( function( result) {
console.log('OK');
}, function (error) {
notify(error); // (2)
});
}
}
projectViewCtrl.$inject = [ '$scope', 'project', 'notify'];
app.controller('projectViewCtrl', projectViewCtrl);
答案 0 :(得分:0)
这是要添加到您的服务中的很多代码!我认为你要找的是interceptor。您可以拦截所有呼叫并进行日志记录,而无需向所有服务添加代码。这是一个在401
响应上重定向用户的示例,否则会记录到控制台:
angular.module('myApp')
.factory('errorInterceptor', function ($q, $injector) {
return {
responseError: function(res) {
if(res.status === 401) {
$injector.get('$state').go('login');
} else {
console.log(res);
}
return $q.reject(r);
}
};
});
您还需要在app.config:
中注册拦截器$httpProvider.interceptors.push('errorInterceptor');