![](/img/trans.png)
[英]How to await an async call in JavaScript in a synchronous function?
[英]Behavior of synchronous function call vs “await” on async function call
某些 Node.js 模块(内置和其他)提供相同功能的同步和异步版本(通过回调或承诺)。 例如, bcrypt 模块提供bcrypt.hash()
返回一个 promise 并异步计算散列,或bcrypt.hashSync()
直接返回一个散列值。
但是,有时在此异步操作完成之前无法继续工作,这就是 await 的用途。 鉴于此,这两个代码片段之间有什么区别,其中哪一个是推荐的方式?
const bcrypt = require('bcrypt');
// method 1
const hash1 = bcrypt.hashSync('password123', 10);
console.log(`hashed password: ${hash1}`);
// method 2
(async function() {
const hash2 = await bcrypt.hash('password123', 10);
console.log(`hashed password: ${hash2}`);
})();
第一个有较少的绒毛(没有 async/await 关键字),并且考虑到我正在等待bcrypt.hash()
的响应,我不知道这里异步是否有性能优势。 有什么我想念的吗?
异步函数一旦到达await
,就会立即将控制权交给 JS 调度程序。 它实际上并不“等待”任何事情,而是让 JS 调度程序做它需要做的任何事情,让其他代码运行,知道在未来的某个时候它会得到一个允许它恢复的信号。 性能优势主要是当您拥有可以完全独立于此代码运行的其他代码时。 如果是这样:是的, await
将使事情的性能更高。 但是,如果这是您唯一的代码......那么不,没有理由使用 async/await
bcrypt.hash()
异步版本的bcrypt.hash()
是为不需要bcrypt.hash()
的结果/返回值的其他进程/任务释放线程。
因此,如果您有其他可能需要在hash()
函数完成之前运行的函数/处理程序,这将很有帮助。 如果是这种情况,那么异步bcrypt.hash()
将为您提供更好的性能。 但是就像@Mike 'Pomax' Kamermans 提到的那样,如果您没有任何其他独立于该结果的进程,那么同步bcrypt.hashSync()
就完全没问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.