程序员似乎对如何异步通知错误感到分歧。
一些程序员喜欢使用带有两个参数的回调:一个值和一个布尔值,它告诉该值是否错误。这样做的好处在于它看起来像try catch
语句:
asyncFunct(function (value, noError) {
if (noError) {
// success, do something with value
} else {
// value is the error which is thrown
}
});
其他人更喜欢否定(即布尔值应该判断该值是否错误)。他们的理由是,如果您知道异步函数永远不会抛出错误,那么您可以安全地省略第二个参数,如下所示:
asyncFunction(function (value, isErroneous) {
if (!isErrorneous) {
// success, do something with value
} else {
// value is the error which is thrown
}
});
asyncFunction(function (value) {
// success, do something with value
});
然后有人提出单独的回调以成功执行异步函数和错误执行异步函数的错误。这允许程序员选择是否要处理回调,错误,两者都是:
asyncFunction(function (value) {
// success, do something with value
}, function (error) {
// handle the error
});
asyncFunction(function (value) {
// success, do something with value
});
asyncFunction(null, function (error) {
// handle the error
});
我不是问你喜欢哪种方法。我只是想问一下每种方法的优点和缺点,以便我知道在哪种方法中使用。
答案 0 :(得分:1)
设计决策:
这只是设计决策,仅此而已。如果它是独立的参数,你可以拥有独立的功能并创建“更漂亮”的代码(对于某些人来说 - 对于那些更混乱的人来说 - 这是非常主观的)。
错误复杂性:
在某些应用程序中,您可能会遇到更复杂的错误(filesystem.fileRead
可能有FILE_DONT_EXISTS,FILE_LOCKED,NOT_PERMISSIONS ..)而在某些应用中,您只需抛出错误(db.checkConnection
或db.openConnection
) 。
订单和差异:
很棒的API样本来自亚马逊,您可以查看它。 http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html
响应:在像copyObject(params = {}, callback)
这样的异步函数上,您有回调函数,它在err (Error)
中始终有2个参数:data (Object)
和function(err, data) { ... }
。错误的设计类似于第一个参数,因为如果您有错误,则表示您没有数据。所以这真的是关于优先级和订单。
// request
getObject({
param1 : something,
param2 : something,
param3 : something
}, callback);
// response
function callback(error, response){
if error throw err;
// now deal with responsei
}
正如您所看到的,您有两种混合方式。在请求中,您传递对象和函数,作为响应,您将获得错误和对象(对于该请求函数)。