繁体   English   中英

同步函数调用与异步函数调用中的“await”行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM