我构建了一个工厂来返回使用HTTP的数据获取延迟的承诺。当它是快乐的路径并且网址是正确的时,它工作得很好。但是当出现错误时我想抓住它。似乎我只是在控制台中仍然显示500错误。还有办法赶上这个吗?此外,我想对拒绝进行处理,因为我无法弄清楚如何做到这一点。 TIA
angular.module("accQueries")
.factory('leaseFactory', ['$http', '$q', function ($http, $q) {
return {
leases: '',
makeRequest: function (url) {
// Create the deferred object
var deferred = $q.defer();
$http.get(url).then(function (resp) {
deferred.resolve(resp.data);
})
// potentially catch http error here??
.catch(function (err) {
deferred.reject(err);
console.log('rejected : ' + err );
console.dir(err);
this.leases = '';
});
return deferred.promise;
},
// Return a single lease based on lease number
getLease: function (pLeaseNum) {
this.leases = this.makeRequest("http://someserver/AccruentQA_DB/webresources/restfulservices.latbllease/leaseNumber/" + pLeaseNum);
// Return the lease object stored on the service
return this.leases;
},
// Return all leases based on lease name
getLeases: function () {
this.leases = this.makeRequest("http://someserver/AccruentQA_DB/webresources/restfulservices.latbllease/name/");
// Return the lease object stored on the service
return this.leases;
}
};
}]);
答案 0 :(得分:2)
不需要在$ q中包装$ http调用,因为$ http会返回一个promise本身。所以只需返回$ http即可:
makeRequest: function (url) {
return $http.get(url);
}
如果你想在makeRequest函数中做一些事情并且答案be4传递它,你可以像这样链接承诺:
makeRequest: function (url) {
return $http.get(url).then(function(response){
//do something
return response;
}, function(error){
//do something
return error;
});
}
答案 1 :(得分:1)
无法阻止HTTP错误出现在控制台中。浏览器在将结果传递回角度之前执行此操作。但是,错误会导致$http
承诺被拒绝,这意味着您可以使用then()
的可选第二个参数来处理它{/ p>
return $http.get('url').then(
function(response) {
this.leases = response.data;
},
function(response) {
var statusCode = response.status;
var response = response.data;
// other error processing
this.leases = '';
}
}).then(function() { return this.leases; }
您可以根据状态代码和响应数据执行各种操作。如果您的服务器发出错误500,那就是response.status
。超时的状态为0.
您还应该知道{j}请求完成之前getLease()
将返回。您应该返回promise,然后在调用代码中链接另一个then()
,以便在解析promise后执行某些操作。