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:别担心!如果这回答了你的问题,堆栈溢出的工作方式,你会通过单击答案旁边的复选标记来“接受”答案,这会将其从未回答的问题列表中删除。但仅当您的问题确实得到回答时。