首頁 > web前端 > js教程 > 為什麼在 Promise 建構函式中使用 Async/Await 是反模式?

為什麼在 Promise 建構函式中使用 Async/Await 是反模式?

Susan Sarandon
發布: 2025-01-05 11:23:41
原創
762 人瀏覽過

Why is Using Async/Await Inside a Promise Constructor an Anti-Pattern?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板