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方法返回的错误。