Angularjs 中延迟承诺的错误处理
Error handling in Angularjs for deferred promise
我为 return 数据构建了一个工厂,该工厂通过延迟承诺使用 HTTP Get。当它是快乐的路径并且 url 是正确的时,它工作得很好。但是当出现错误时,我想捕获它。看来我是,但控制台中仍然显示 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;
}
};
}]);
不需要在 $q 中包装 $http 调用,因为 $http returns 本身就是一个承诺。所以像这样返回 $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;
});
}
无法阻止 HTTP 错误出现在控制台中。浏览器在将结果传回 angular 之前执行此操作。但是,错误会导致 $http
承诺被拒绝,这意味着您可以使用 then()
的可选第二个参数来处理它
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。
您还应注意,getLease()
将在 ajax 请求完成之前 return。您应该 return 承诺,然后在调用代码中,链接另一个 then()
以在承诺得到解决后执行某些操作。
我为 return 数据构建了一个工厂,该工厂通过延迟承诺使用 HTTP Get。当它是快乐的路径并且 url 是正确的时,它工作得很好。但是当出现错误时,我想捕获它。看来我是,但控制台中仍然显示 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;
}
};
}]);
不需要在 $q 中包装 $http 调用,因为 $http returns 本身就是一个承诺。所以像这样返回 $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;
});
}
无法阻止 HTTP 错误出现在控制台中。浏览器在将结果传回 angular 之前执行此操作。但是,错误会导致 $http
承诺被拒绝,这意味着您可以使用 then()
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。
您还应注意,getLease()
将在 ajax 请求完成之前 return。您应该 return 承诺,然后在调用代码中,链接另一个 then()
以在承诺得到解决后执行某些操作。