![](/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.