簡體   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