[英]How should I set up asynchronous error handling with promises in angular?
目前,我的应用程序中的流程看起来像这样
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函数中的promise失败,则错误处理仅限于该promise,外部调用者无法知道它是否失败。 如果我需要在$ q.all'then'件中的searchAsync调用之后访问$ scope.search.data,我将无法知道它是否由于处理过的捕获或由于没有匹配项而没有任何项。 使用诺言时,是否可以使用一种更干净的方式来设置错误处理?
使用诺言时,是否可以使用一种更干净的方式来设置错误处理?
是的:不要在那里处理。
由于searchAsync
返回一个searchAsync
,因此除非它可以有意义地将错误转换为结果(看起来不可能),否则它不应该自己处理错误(除了可以选择将其保留为错误的方式进行转换)。 相反,它应该让其调用方处理错误。 您当前拥有的catch
块将值undefined
的错误(拒绝的promise)转换为成功(解决的promise)。 (不仅仅是您,这是一个常见错误。)
要么删除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;
});
}
一般情况下,一个函数应该要么处理错误或返回的承诺链,但很少两者。 让错误通过链传播到顶层,将错误处理留给顶层,同时有选择地让所有级别知道它们发生了。 (再次:您可以转换错误,或通过执行某些操作然后重新抛出来“敲击”错误;这些都很好。将失败无声地转换为成功- undefined
是不可行的::))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.