包装一个node.js的同步函数是否会使其执行与异步函数相同?



没有错误处理的简单示例:

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);
    }
}

如果函数异步抛出,那么即使这样也不会捕获异常,代码也很糟糕,不能安全使用,因为在大多数情况下,在系统调用异步异常之前,没有办法捕获异常,而不是由您的代码。

最新更新