【问题标题】:Behavior of synchronous function call vs "await" on async function call异步函数调用上的同步函数调用与“等待”的行为
【发布时间】:2020-08-29 01:42:42
【问题描述】:

某些 Node.js 模块(内置和其他)提供相同功能的同步和异步版本(通过回调或承诺)。例如,bcrypt 模块提供了bcrypt.hash(),它返回一个promise 并异步计算哈希值,或者bcrypt.hashSync() 直接返回一个哈希值。

但是,有时在异步操作完成之前工作无法继续,这就是 await 的用途。鉴于此,这两种代码 sn-ps 有什么区别,推荐使用哪一种?

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 是否有性能优势。我有什么遗漏吗?

【问题讨论】:

  • 我认为这条评论回答了我的问题 - 解释了两种方法之间的区别以及为什么一种更好。因此,如果您将此作为答案发布,我可以将其标记为一个。我的意思是在其他代码也存在的上下文中,但我将示例缩减为所需的最少信息。

标签: javascript node.js async-await


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    bcrypt.hash() 的异步版本的要点是为不需要bcrypt.hash() 的结果/返回值的其他进程/任务释放线程。

    因此,如果您有其他可能需要在 hash() 函数完成之前运行的函数/处理程序,这将很有帮助。如果是这种情况,那么异步 bcrypt.hash() 会为您提供更好的性能。但是就像@Mike 'Pomax' Kamermans 提到的那样,如果您没有任何其他独立于该结果的进程,那么同步的bcrypt.hashSync() 就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-10
      • 2020-09-08
      • 1970-01-01
      • 2012-07-25
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      相关资源
      最近更新 更多