他们想说的是你应该设计你的模块,以便异步函数不会抛出错误来捕获,而是在回调内部处理(就像你提供的 fs.readdir 示例中一样).. .
所以,例如,这就是他们所说的你应该像这样设计你的模块:
var example = {
logString: function(data, callback){
var err = null;
if (typeof data === "string") {
console.log(data);
} else {
err = {"message": "Data is not a string!"};
}
callback(err);
}
}
他们希望您对其进行设计,以便最终用户可以在回调中处理错误,而不是使用 try/catch 语句...例如,当我们使用 example 对象时:
example.logString(123, function(err){
// Error is handled in callback instead of try/catch
if (err) console.log(err)
});
这将记录{"message": "Data is not a string!"},因为数据中的typeof 不等于"string"。
下面是他们所说的你应该避免的例子:
他们不希望您在使用异步回调时抛出错误...假设我们重新设计了我们的模块,因此logString 方法会抛出错误而不是将其传递给回调...像这样:
var example = {
logString: function(data, callback){
if (typeof data === "string") {
console.log(data);
} else {
// See, we're throwing it instead...
throw {"message": "Data is not a string!"};
}
callback();
}
}
有了这个,我们必须执行整个 try/catch 语句,否则你会得到一个未捕获的错误:
try {
example.logString(321, function(){
console.log("Done!")
});
} catch (e) {
console.log(e)
}
最后的想法/总结:
我认为 NPM 建议这种方法的原因是因为它在异步方法内部更易于管理。
NodeJS 和 JavaScript 通常喜欢有一个异步环境,非常好将它们紧凑到一个地方,错误处理等等。
使用 try/catch,这只是您必须采取的额外步骤,它可以在回调内部轻松处理(如果您正在异步设计它,您应该这样做)。