Javascript 我应该如何使用angular中的Promissions设置异步错误处理?
目前,我的应用程序中的流程如下所示Javascript 我应该如何使用angular中的Promissions设置异步错误处理?,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,目前,我的应用程序中的流程如下所示 function searchAsync() { $scope.search.inProgress = true; return Service.search($scope.search.parameters).$promise .then(function (data) { $scope.search.data = data; }).catch(function (e) {
function searchAsync() {
$scope.search.inProgress = true;
return Service.search($scope.search.parameters).$promise
.then(function (data) {
$scope.search.data = data;
}).catch(function (e) {
displayError(e);
}).finally(function () {
$scope.search.inProgress = false;
});
}
function initialize() {
var promises = [];
promises.push(setLookupsAsync($scope.categories, LookupResource.getCategories));
promises.push(setLookupsAsync($scope.topics, LookupResource.getTopics));
promises.push(setLookupsAsync($scope.races, LookupResource.getRaces));
promises.push(setLookupsAsync($scope.genders, LookupResource.getGenders));
$q.all(promises).then(function () {
searchAsync()
}).catch(function (e) {
displayError(e);
}).finally(function () {
$scope.page.loaded = true;
});
}
我发现,如果searchAsync函数内部的承诺失败,那么错误处理是该承诺的本地处理,外部调用方无法知道它是否失败。如果我需要在$q.all“then”部分中的searchAsync调用之后访问$scope.search.data,我将无法知道它是否由于处理的捕获或没有匹配的项而没有任何项。在处理承诺时,是否有更干净的方法来设置错误处理
在处理承诺时,是否有更干净的方法来设置错误处理
是的,不要在那里处理
由于searchAsync
返回一个承诺,因此它不应该处理错误本身(除了选择性地转换错误,同时将它们保留为错误),除非它能够有意义地将错误转换为结果(看起来它不可能)。相反,它应该让它的调用者处理错误。当前使用的catch
块将错误(拒绝的承诺)转换为成功(已解决的承诺),其值为未定义。(不仅仅是你,这是一个常见的错误。)
取下锁扣
:
function searchAsync() {
$scope.search.inProgress = true;
return Service.search($scope.search.parameters).$promise
.then(function (data) {
$scope.search.data = data;
}).finally(function () {
$scope.search.inProgress = false;
});
}
…或保留它以调用displayError
,但重新显示错误:
function searchAsync() {
$scope.search.inProgress = true;
return Service.search($scope.search.parameters).$promise
.then(function (data) {
$scope.search.data = data;
}).catch(function (e) {
displayError(e);
throw e; // <=========
}).finally(function () {
$scope.search.inProgress = false;
});
}
函数searchAsync(){
$scope.search.inProgress=true;
return Service.search($scope.search.parameters)。$promise
.then(功能(数据){
$scope.search.data=数据;
}).catch(函数(e){
显示错误(e);
抛出e;//
在处理承诺时,是否有更干净的方法来设置错误处理
是的,不要在那里处理
由于searchAsync
返回一个承诺,因此它不应该处理错误本身(除了选择性地转换错误,同时将错误保留为错误),除非它可以有意义地将错误转换为结果(看起来它不可能)。相反,它应该让调用者处理错误。您当前遇到的catch
块将错误(拒绝的承诺)转换为成功(已解决的承诺),其值为未定义的(不只是您,这是一个常见错误)
取下锁扣
:
function searchAsync() {
$scope.search.inProgress = true;
return Service.search($scope.search.parameters).$promise
.then(function (data) {
$scope.search.data = data;
}).finally(function () {
$scope.search.inProgress = false;
});
}
…或保留它以调用displayError
,但重新显示错误:
function searchAsync() {
$scope.search.inProgress = true;
return Service.search($scope.search.parameters).$promise
.then(function (data) {
$scope.search.data = data;
}).catch(function (e) {
displayError(e);
throw e; // <=========
}).finally(function () {
$scope.search.inProgress = false;
});
}
函数searchAsync(){
$scope.search.inProgress=true;
return Service.search($scope.search.parameters)。$promise
.then(功能(数据){
$scope.search.data=数据;
}).catch(函数(e){
显示错误(e);
抛出e;/@Andrew:别担心!如果这回答了你的问题,堆栈溢出的工作方式,你会通过单击旁边的复选标记来“接受”答案,这会将其从未回答问题列表中删除。但只有当你的问题真的得到了回答时。@Andrew:别担心!如果这回答了你的问题,堆栈溢出的工作方式,你会通过单击答案旁边的复选标记来“接受”答案,这会将其从未回答的问题列表中删除。但仅当您的问题确实得到回答时。