[英]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.