查看 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/