javascript - 如果函数不使用任何 I/O,NodeJS 异步函数的目的是什么?

标签 javascript node.js asynchronous express bcrypt

查看 NodeJS bcrypt 包 ( https://www.npmjs.com/package/bcrypt ),似乎有一对异步/同步函数:

  • genSalt/genSaltSync
  • 哈希/哈希同步
  • 比较/比较同步

我理解在函数具有 I/O(例如磁盘或网络访问)的情况下异步函数的目的,以免阻塞事件循环。但是对于像上面这样没有 I/O 的情况,使用异步版本有什么优势呢?

选择同步版本会损失什么?我愿意这样做,因为它可以简化代码,而且我看不出有任何缺点。

https://stackoverflow.com/a/11606391/779159它说“如果可能的话,你会想使用异步版本,这样你就不会在密码散列过程中占用你的 Node 处理”,但是无论如何你的代码都不会被占用,因为这些函数正在使用 CPU 而不是比 I/O?

最佳答案

如果您使用异步版本,其他代码仍将运行。例如:

异步

var startTime = new Date;

setInterval(function() {
    console.log('interval ' + (new Date - startTime));
}, 100);


setTimeout(function() {
    console.log('starting hashing');
    bcrypt.hash('bacon', 12, function (done) {
        console.log('hashing done');
    });
}, 300);

将打印:

interval 107
interval 214
starting hashing
interval 315
interval 415
interval 515
hashing done
interval 615

同步

代码的同步版本如下所示:

var startTime = new Date;

setInterval(function() {
    console.log('interval ' + (new Date - startTime));
}, 100);


setTimeout(function() {
    console.log('starting hashing');
    bcrypt.hashSync('bacon', 12);
    console.log('hashing done');
}, 300);

然后输出类似的东西

interval 105
interval 212
starting hashing
hashing done
interval 535
interval 635

我不确定它是如何在 bcrypt 模块内部完成的,也许它正在启动一个新线程,因为它是 native 代码?我想您可以查看 bcrypts 源以了解详细信息。

关于javascript - 如果函数不使用任何 I/O,NodeJS 异步函数的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33466458/

相关文章:

javascript - VIES 增值税号验证

node.js - morgan 使用 Node js + Express 的文件旋转器流登录单独的 js

node.js - npm start 在 CRA "with no error"中不起作用

javascript - 在 Meteor js 中生成 PDF 报告

node.js - 将加密类转换为异步代码

javascript - 似乎无法将 val 存储到 var 中以便稍后回调

javascript - 如果浏览器不支持 ES6 模板文字,则创建错误消息

javascript:检查字符串中包含哪个数组条目

javascript - 使用 Javascript 闭包将附加数据传递给 API 回调函数

linux - Linux 上真的没有异步 block I/O 吗?