Promise 建構子反模式:在Promise() 中使用Async/Await
在非同步程式設計中,在執行器函數中使用async/await Promise() 建構子被認為是反模式。這種做法涉及在承諾中嵌入承諾,從而導致可能無法正確傳播的潛在錯誤。
考慮下面的程式碼片段:
const { eachLimit } = require("async"); function myFunction() { return new Promise(async (resolve, reject) => { eachLimit((await getAsyncArray), 500, (item, callback) => { // do other things that use native promises. }, (error) => { if (error) return reject(error); // resolve here passing the next value. }); }); }
在此範例中,呼叫了 myFunction 並且Promise 建構函式透過非同步函數作為其執行器來呼叫。這種模式是有問題的,因為它可能導致錯誤無法正確傳播。如果在eachLimit回調中發生任何錯誤,它們將不會被Promise捕獲,並且會默默地失敗。
此外,在Promise構造函數中使用async/await可能會讓這些陷阱更加令人驚訝。例如,比較以下內容:
let p = new Promise(resolve => { ""(); // TypeError resolve(); }); (async () => { await p; })().catch(e => console.log("Caught: " + e)); // Catches it.
在此範例中,TypeError 在執行器函數內同步拋出。然而,當使用 async/await 等待 Promise 時,錯誤會被 catch 區塊捕獲,即使它發生在 Promise 被解析之前。此行為可能會導致混亂和意外結果。
為了避免這種反模式,建議避免在 Promise() 建構函式的執行器函式中使用 async/await。相反,使用 then 或 catch 方法來連結額外的 Promise 並處理錯誤。
以上是為什麼在 Promise 建構函式中使用 Async/Await 是反模式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!