包装node.js同步函数是否使其与异步等效函数相同?

时间:2015-09-02 21:54:16

标签: javascript node.js asynchronous fs

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

var fs = require('fs');

function read(filename, cb) {
  return cb(fs.readFileSync(filename));
}

对于事件循环,这是否与性能相同,如下:

fs.readFile(filename, cb);

我问的原因是加密库中的一些异步函数仍会抛出错误而不是将它们传递给回调。我想创建一个自定义异步函数,以我想要的方式进行错误处理,但我担心使用本机方法的Sync版本,因为它们在节点社区中的不良声誉导致性能不佳。那么,通过创建包装函数,我提出的方式是否安全?

2 个答案:

答案 0 :(得分:3)

没有

异步的全部意义在于,readFileSync()完成的实际工作在事件循环中发生

完全不可能调用同步函数并使其异步。

答案 1 :(得分:0)

您无法以任何方式使异步函数突然在本机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处理程序中包装crypto函数来解决它,如果抛出错误就会调用回调函数。

假设您有这样的加密函数:

function badCryptoFunc(arg1, arg2, callback)

你可以像这样包装:

function myCryptoFunc(arg1, arg2, callback) {
    try {
        badCryptoFunc(arg1, arg2, callback);
    } catch(e) {
        callback(e);
    }
}

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