javascript - 异步函数调用上的同步函数调用与“等待”的行为
问题描述
某些 Node.js 模块(内置的和其他的)提供相同功能的同步和异步版本(通过回调或承诺)。例如,bcrypt 模块提供bcrypt.hash()
了返回一个承诺并异步计算散列,或者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()
无论如何都在等待响应,我不知道这里的 async 是否有性能优势。有什么我想念的吗?
解决方案
一个异步函数,一旦它到达一个await
,将立即将控制权交给 JS 调度程序。它实际上并没有“等待”任何事情,而是让 JS 调度程序做它需要做的任何事情,让其他代码运行,因为它知道在未来的某个时候它会得到一个允许它恢复的信号。性能优势主要是当您拥有可以完全独立于该代码运行的其他代码时。如果是这样:是的,await
这将使事情变得更加高效。但是,如果这是您唯一的代码......那么不,没有理由使用 async/await
推荐阅读
- java - 无法更新 Maven 配置
- sql - Where execution order on castable int
- php - vtiger 6.4 vtwsclib doInvoke()自定义网络服务不起作用
- python - MLP learning produces bad outcomes for simple cases
- symfony4 - 如何防止“prod”环境显示完整的 symfony4 错误?
- html - 为什么旋转的图像在 css 表中显示不同?
- c# - XmlDocument.Save() 异常 System.ObjectDisposedException:无法访问已关闭的文件
- sql - 将递增值添加到 postgresql 中的列
- xamarin.forms - Set master page full screen on xamarin forms
- mysql - Fetch last 3 month data as separate columns not rows for each user