没有错误处理的简单示例:
var fs = require('fs');
function read(filename, cb) {
return cb(fs.readFileSync(filename));
}
在事件循环的性能方面,这是否与:
fs.readFile(filename, cb);
我问的原因是加密库中的一些异步函数仍然抛出错误,而不是将它们传递给回调。我想做一个自定义的异步函数,以我想要的方式处理错误,但我担心使用本地方法的同步版本,因为它们在节点社区中性能不好。那么,按照我提出的方法,仅仅创建一个包装器函数是否安全呢?
No.
异步的全部意义在于,实际的工作是由readFileSync()
完成的,在事件循环之外发生。
完全不可能调用同步函数并使其异步。
你不可能以任何方式让一个异步函数在原生node.js中突然同步运行(例如,不创建另一个进程或使用第三方库来执行一些线程)。这是不可能的。
这对你一点帮助都没有:
function read(filename, cb) {
return cb(fs.readFileSync(filename));
}
它只是实现了一个同步回调,并没有真正解决任何问题。代码仍然是完全同步的,因此您没有获得异步I/O的任何好处。异步I/O的重要好处是,你希望主JS事件循环不等待文件I/O发生。您希望node.js事件循环能够在本机代码中进行文件I/O时执行其他操作。只要您使用fs.readyFileSync()
,无论您在它周围放置什么,都不会出现这种情况。
如果你有一些异步加密方法同步抛出异常,而不是将错误传递给他们的回调,那是设计不良的代码,我甚至会考虑使用该代码。
但是,您可以通过将加密函数包装在自己的try catch处理程序中来解决这个问题,该处理程序将在抛出错误时调用回调函数。
假设你有一个这样的加密函数:
function badCryptoFunc(arg1, arg2, callback)
你可以像这样换行:
function myCryptoFunc(arg1, arg2, callback) {
try {
badCryptoFunc(arg1, arg2, callback);
} catch(e) {
callback(e);
}
}
如果函数异步抛出,那么即使这样也不会捕获异常,代码也很糟糕,不能安全使用,因为在大多数情况下,在系统调用异步异常之前,没有办法捕获异常,而不是由您的代码。