节点中的一个约定是将错误参数传递给异步操作:
async.someMagicalDust(function(callback) {
// some asynchronous task
// […]
callback();
}, function(err) {
// final callback
if(err) throw err;
// […]
});
也许我太天真了,但我从未成为if(variable)
符号的忠实粉丝 - 可能是从C继承的,原因是have already been discussed many times in the past。
另一方面,我有时遇到null
参数并且出现此错误检查:
if(typeof err !== 'undefined' && err !== null)
有点过于冗长。
另一个解决方案是
if(err != null)
但我认为non-strict check可能很棘手,即使我认为与null比较时也是正常的。
检查节点中错误参数的最佳方法是什么?
答案 0 :(得分:2)
使用if(err)
。
它旨在以这种方式使用。节点样式的回调应该仅在实际错误的情况下将错误设置为非虚假值。您无法找到将err
设置为''
或0
以表示错误的明智示例。
就像YlinaGreed所指出的那样,如果模块约定从null
到undefined
再到0
到甚至NaN
,那么你仍然是安全的。我从来没有被使用过if(err)
。
另一方面,你可能想使用coffescript,它会为你翻译
unless err? then...
到
if (typeof err === "undefined" || err === null) {
模仿最常见的模式。
确认if(err)
方法的一些链接:
async
的作者Caolan McMahon撰写)约定似乎是传递一个错误对象作为第一个参数而null
没有错误,所以即使你传递一个空对象,它仍然是一个错误。
如果使用流行的express
框架,则应该使用next
回调从中间件返回,该中间件遵循errback约定。
我相信大多数人更喜欢简洁next()
而非next(null)
,这意味着第一个参数将评估为undefined
而不是null
,这当然是完美的正常使用。
答案 1 :(得分:0)
对我而言,处理错误的最佳方法是" if(err == null)" 这是我使用非严格运算符的唯一情况,原因如下:
这主要是"惯例",我有我的,你也确实有你的......只要小心选择其中一个"好&# 34;方法。
答案 2 :(得分:0)
Node的主要回调约定是传递一个以err
作为第一个参数的函数。根据我的经验,一直可以安全地检查错误是否真实 - 在实践中,如果出现错误时您的错误出现null,则问题更多地在于实现。我总是希望如果err
为空,则不会发生错误。由于使用单独的函数来处理错误和成功,这可能会让人感到困惑,这更像是JQuery.Ajax和promises的风格。我倾向于发现双重回调有点过于啰嗦而不能打电话。
鉴于您的示例,您似乎正在使用非常好的异步库。如果我想要执行并行选项,我就是这样设置的:
function doAThing(callback) {
var err;
// do stuff here, maybe fill the err var
callback(err);
}
function doAsyncThings(callback) {
var tasks = [function(done) { // stuff to do in async
doAThing(function(err) {
done(err);
});
}];
async.parallel(tasks, function(err) { // single callback function
callback(err); // I send the error back up
});
}
请注意,我没有抛出错误,而是将其冒充回请求链。有几个实例我想要实际抛出一个错误,因为你基本上是在说“崩溃整个应用程序”。
我觉得它更简单,减少了调用函数所需的参数数量。在整个过程中使用此约定时,只需将回调作为参数传递而不是创建新的匿名函数,就可以简化:
function doAThing(callback) {
var err;
// do stuff here, maybe fill the err var
callback(err);
}
function doAsyncThings(callback) {
var tasks = [function(done) { // stuff to do in async
doAThing(done);
}];
async.parallel(tasks, callback); // the error is sent back to the original function
}
我发现通常你想要在它们被调用的函数中处理这些错误。所以在这种情况下,doAsyncThings
的调用者可以检查是否存在错误并处理它适合自己的范围(和如果它是一个API,可能会为用户提供更好的信息。