首页 > 解决方案 > 异步函数调用上的同步函数调用与“等待”的行为

问题描述

某些 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 是否有性能优势。有什么我想念的吗?

标签: javascriptnode.jsasync-await

解决方案


一个异步函数,一旦它到达一个await,将立即将控制权交给 JS 调度程序。它实际上并没有“等待”任何事情,而是让 JS 调度程序做它需要做的任何事情,让其他代码运行,因为它知道在未来的某个时候它会得到一个允许它恢复的信号。性能优势主要是当您拥有可以完全独立于该代码运行的其他代码时。如果是这样:是的,await这将使事情变得更加高效。但是,如果这是您唯一的代码......那么不,没有理由使用 async/await


推荐阅读