Node.js 中非阻塞函數的正確實作
儘管存在誤解,但僅僅將程式碼包裝在Promise 中並不會使其成為非阻塞-阻塞。 Promise 執行器函數本質上是同步的,會阻止執行。這是在列印後續行之前在提供的程式碼中觀察到延遲的原因。
提供的程式碼的問題
程式碼最初看起來是非阻塞的,利用 Promise 回傳計算密集 longRunningFunc 的結果。然而,在執行時,我們觀察到在列印第二行和第三行之前有延遲,這表明程式正在等待 Promise 解析。
Node.js 中真正的非阻塞程式碼
為了在Node.js 中建立真正的非阻塞程式碼,我們有幾個選項:
修改範例
雖然將程式碼包裝在Promise 中不足以實現非阻塞行為,但我們可以使用setTimeout() 來調度for 迴圈以便稍後執行:
function longRunningFunc(val, mod) { return new Promise((resolve, reject) => { setTimeout(() => { let sum = 0; for (let i = 0; i < 100000; i++) { for (let j = 0; j < val; j++) { sum += i + j % mod; } } resolve(sum); }, 10); }); }
這種方法改變了 for 迴圈的時間,給出非阻塞行為的出現。然而,需要注意的是,for 迴圈一旦被調度仍然會同步執行。為了實現真正的非阻塞程式碼,我們需要採用前面描述的技術之一。
以上是如何正確實作Node.js的非阻塞功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!