Javascript AngularJS:$q执行链中的独占错误处理

Javascript AngularJS:$q执行链中的独占错误处理,javascript,angularjs,Javascript,Angularjs,有一个返回承诺的角度服务,是否可以检测这个承诺的消费者是否处理错误?我想在服务中提供一个默认的错误处理,但要确保只有在执行链中没有定义错误处理程序时才使用它 服务方法如下所示: function serviceMethod(method, url, data) { return $http({ method: method, url: url, data: data }) .then( function (r

有一个返回承诺的角度服务,是否可以检测这个承诺的消费者是否处理错误?我想在服务中提供一个默认的错误处理,但要确保只有在执行链中没有定义错误处理程序时才使用它

服务方法如下所示:

function serviceMethod(method, url, data)
{
    return $http({
        method: method,
        url: url,
        data: data
    })
    .then(
        function (response) {
            return response;
        },
        function (response) {
            console.log('ERROR!'); // default error handling
        }
    );
}
function serviceMethod(method, url, data)
{
    return $http({
        method: method,
        url: url,
        data: data
    })
    .then(
        function (response) {
            return response;
        },
        function (response) {
            return response; // default error handling
        }
    );
}
serviceMethod
返回一个承诺,因此:

1) 如果使用者提供错误处理程序,则该错误应由使用者独占处理

$scope.getResponse = function () {
    return Services.serviceMethod('put', $scope.url, $scope.someData)
    .then(function (response) {

    }, function (error) {
        // Custom error handling.
    });
}
2) 如果使用者不提供处理程序,则错误应由服务处理程序专门处理


是否有可能在
服务方法的第一个继任者中实现?是否可能在链中的任何一点(错误由提供错误处理程序的第一个消费者专门处理)?

您已经在给出的代码中找到了答案。这样做:

function serviceMethod(method, url, data)
{
    return $http({
        method: method,
        url: url,
        data: data
    })
    .then(
        function (response) {
            return response;
        },
        function (response) {
            console.log('ERROR!'); // default error handling
        }
    );
}
function serviceMethod(method, url, data)
{
    return $http({
        method: method,
        url: url,
        data: data
    })
    .then(
        function (response) {
            return response;
        },
        function (response) {
            return response; // default error handling
        }
    );
}
以及您的
getResponse
方法:

$scope.getResponse = function () {
    return Services.serviceMethod('put', $scope.url, $scope.someData)
    .then(function (response) {

    }, function (error) {
        alert(error.code); //Default error handling returned from error function in serviceMethod
        alert("My custom error"); //Custom error handling
    });
}

服务
中的拒绝处理程序抛出错误响应是非常重要的。否则,$q服务将将被拒绝的承诺转换为成功响应

function serviceMethod(method, url, data)
{
    return $http({
        method: method,
        url: url,
        data: data
    })
    .then(
        function (response) {
            return response;
        },
        function (errorResponse) {
            //return response; // default error handling
            throw errorResponse;
            //OR
            //return $q.reject(errorResponse);
        }
    );
}
一个常见的问题是,由于没有归还任何东西,将被拒绝的承诺错误地转换为履行的承诺。当函数省略return语句时,该函数返回值
undefined
。在这种情况下,$q服务将把一个被拒绝的承诺转换为一个已履行的承诺,该承诺的解析值为
undefined


也就是说。不,服务不可能知道消费者将如何使用被拒绝的承诺。如果使用者希望服务跳过默认错误处理,则使用者必须在服务调用中指定:

function serviceMethod(method, url, data, skipErrorHandling)
{
    return $http({
        method: method,
        url: url,
        data: data
    })
    .then(function (response) {
        return response.data;
    })
    .catch(function (errorResponse) {
        if (skipErrorHandling)
            throw errorResponse;
        }
        //Put error handler here
        //Correct error
        var promise = retry(method, url, data);
        return promise;
    );
}

您不应该使用.catch来处理错误吗?据我记忆所及,常规链是:
$http(某物)。然后(成功)。捕获(错误)
。无论如何,如果你想让事情变得更清楚,你可能会从每种情况中返回一个对象:如果出现错误,你可能会返回:
{success:false,error:errovariable}
catch
难道不只是
promise的缩写吗?然后(null,errorCallback)
?我的链可以稍微长一点,通常是这样的:
($http(某物)。然后(successHandler,errorHandler))。然后(successHandler,errorHandler)
,依此类推。错误处理程序是可选的。每个HTTP请求都有一个响应,可以处理一个捕获(错误),无论有多少个链,它们都将提供一个成功场景和一个错误场景。如果你想手动处理每一种情况,你可以返回一个对象(如上所述),或者,可以定义一些回调并从服务处理程序调用它们。考虑400——假设在某些情况下,我并不真正关心这个错误,我只想告诉用户有一个错误。在某些情况下,我想把错误放到控制台上。在另一种情况下-显示带有错误消息的对话框,或者以某种方式更新HTML元素。可能有一个假设的链包含了所有这些,我只想调用最后一个,不管链的长度和它包含的处理程序的数量。这迫使我重复代码,一遍又一遍地重写相同的东西。默认行为是全局的,并且在绝大多数情况下都会使用,因此它应该在通用的全局抽象中定义。我认为,它不可能比这更好。表服务返回承诺,并且
getResponse
方法接收
serviceMethod
中的error方法返回的错误。