AngularJS - 承诺处理错误
问题描述:
我正在使用提供程序通过我的角度应用程序中的API获取一些数据,然后在控制器中使用它。 API调用有时会关闭,导致500错误。这个错误会打印到控制台,我不知道如何正确处理它。AngularJS - 承诺处理错误
这里是我的供应商代码:
function myPvdr() {
this.getUrl = function() {
return 'http://path/to/my/API';
};
this.$get = function($q, $http) {
var self = this;
return {
getData: function(points) {
var d = $q.defer();
$http({
method: 'GET',
url: self.getUrl(),
cache: true
}).success(function(data) {
d.resolve(data);
}).error(function(err) {
d.reject(err);
});
return d.promise;
}
}
}
}
这里是我如何使用它在我的控制器:
function myCtrl($scope, myProvider, localStorageService) {
$scope.myData = localStorageService.get('data') || {};
myProvider.getData()
.then(function(data) {
localStorageService.set('data', data);
$scope.data = data;
});
}
我怎样才能妥善处理500错误,即不引发任何错误控制台并使用本地存储提供的数据(如果有)?
非常感谢
答
var app = angular.module('app', []);
function myProvider($http, $q) {
this.getUrl = function() {
return 'http://path/to/my/API';
};
this.getdata = function(points) {
var d = $q.defer();
$http({
method: 'GET',
url: this.getUrl(),
cache: true
}).then(function(data) {
d.resolve(data);
},function(err) {
d.reject(err);
});
return d.promise;
};
return this;
}
app.factory('myProvider', myProvider);
app.controller('firstCtrl', function($scope,myProvider){
// $scope.myData = localStorageService.get('data') || {};
getdata = function() {
myProvider.getdata()
.then(function(data) {
localStorageService.set('data', data);
$scope.data = data;
},
//handle error
function(e){
alert("Error " + e.status);
});
};
getdata();
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="app">
<div ng-controller="firstCtrl">
</div>
</body>
答
您可以赶上拒绝承诺的是这样的:
myProvider.getData()
.then(function(data) {
// promise resolved, data treatment
}, function(error) {
// promise rejected, display error message
});
或
myProvider.getData()
.then(function(data) {
// promise resolved, data treatment
})
.catch(function(error) {
// promise rejected, display error message
});
这对Angular来说是不可知的。作为错误处理问题的副本关闭。另外请考虑阅读关于延期反模式以及如何避免它。你的整个getdata可以类似地返回$ http.get(...因为$ http已经返回promise。 – 2014-09-23 22:58:53