在 JavaScript 中使用 async-await 解釋 Promise.all?


像加兩個數字或字串操作這樣的簡單操作在 JavaScript 中順序執行並立即返回結果。但在為現實世界的應用程式編寫程式碼時,我們經常會進行耗時的資料庫呼叫、API 呼叫和其他應用程式呼叫。這些較長的呼叫不會立即返回結果;它們會返回一個 Promise。

Promise 是一個物件,用於表示非同步操作的未來結果。它用於處理非同步程序最終的成功或失敗。例如,如果您在 JavaScript 中從 API 請求某些物件,您將獲得一個 Promise,表示該任務最終會完成或失敗。一段時間後,您將獲得 Promise 的結果,無論它是 fulfilled 還是 rejected。

Promise.all()

  • Promise.all() 是一種方法,它接受多個 Promise 作為輸入並返回單個 Promise。

  • Promise 在處理 JavaScript 中程序的非同步特性方面非常有效。

  • 如果所有輸入的 Promise 都已 fulfilled 且沒有被拒絕,則結果將是一個單個 Promise,其中包含來自輸入 Promise 的結果值的陣列。

  • 如果任何輸入的 Promise 被拒絕,那麼我們將立即得到一個被拒絕的 Promise,其中包含 Promise 拒絕中提到的原因。它不會給我們剩餘成功或已解決的 Promise 的結果。

  • 由於 Promise 的結果是一個可迭代的陣列,因此我們可以執行迴圈並根據需要執行操作。

語法

使用者可以使用以下語法在 JavaScript 中使用 Promise.all()。

Promise.all([promise1, promise2, promise3, ….])

Promise.all() 接受一個數組可迭代物件作為輸入。輸入陣列可以包含所有 Promise 或物件。

Async-await

async 關鍵字用於宣告非同步函式,“await”關鍵字可以在該函式的主體中使用。async 和 await 關鍵字一起以更簡潔的程式碼顯示非同步程序行為。

通常,async 函式將具有任意數量的 await 語句或沒有 await 語句。與 try-catch 塊相比,async-await 關鍵字提供了更簡潔的程式碼。async 關鍵字使 JavaScript 函式返回一個 Promise,“await”關鍵字用於等待 Promise。

語法

async function function_name{
   let result = await (value);
   . . . . . . .
   . . . . . . .
}

現在我們已經瞭解了 promise.all() 和 async-await 關鍵字。讓我們看看在 JavaScript 中一起使用 async-await 和 promise.all() 的方法。

Promise.all 與 async-await

在 JavaScript 中使用 Promise.all 方法和 async-await 的語法如下

語法

在 JavaScript 中使用 Promise.all 方法和 async-await 的語法如下:

async function example() {
   try {
      const results = await Promise.all([promise1, promise2, ...]);
   } catch (error) {
      // handle error
   }
}

這裡promise1promise2 等是你想要等待的 Promise。如果所有輸入的 Promise 都已 fulfilled,則 Promise.all 方法返回一個已 fulfilled 的 Promise,其中包含所有輸入 Promise 值的陣列。如果任何輸入的 Promise 被拒絕,則 Promise.all Promise 將被拒絕,原因是第一個被拒絕的 Promise。

async 函式示例使用 try/catch 語句來處理錯誤情況,如果任何輸入的 Promise 被拒絕,則執行 catch 塊。

示例 1

讓我們以 Instagram 等社交媒體平臺為例。可以在 Instagram 上執行某些操作,包括點贊、評論和分享。因此,讓我們為點贊、評論和分享等操作建立三個 Promise。讓我們使用promise.all()以及 async 和 await 關鍵字從其他函式訪問這些 Promise。

<html>
<body>
   <h2> Using the <i> Promise.all() </i> Method</h2>
   <p id="output"> </p>
   <script>
      let like_promise = () => {
         return new Promise((resolve, reject) => {
            resolve("Liked ");
         });
      };
      let comment_promise = () => {
         return new Promise((resolve, reject) => {
            resolve("commented ");
         });
      };
      let share_promise = () => {
         return new Promise((resolve, reject) => {
            resolve("shared ");
         });
      };
      let main_promise = async () => {
         let result = await Promise.all([like_promise(), comment_promise(), share_promise(), ]);
         document.getElementById("output").innerHTML = result
      };
      main_promise();
   </script>
</body>
</html>

讓我們來看一個當 Promise 被拒絕時的例子,如果我們考慮一個將部落格釋出到網站的場景。釋出的三個情況是:已釋出部落格、正在進行的部落格和已刪除的部落格。讓我們拒絕已刪除部落格情況下的 Promise 並觀察輸出。

在 JavaScript 中建立此示例的步驟如下。

  • 步驟 1 - 在 JavaScript 中建立一個 post 函式,該函式應該返回一個已 fulfilled 的 Promise。

  • 步驟 2 - 在 JavaScript 中建立一個 progress 函式,該函式也應該返回一個已 fulfilled 的 Promise。

  • 步驟 3 - 在 JavaScript 中建立一個 del 函式,在呼叫時拒絕 Promise。

  • 步驟 4 - 在 JavaScript 中建立一個非同步函式,該函式使用promise.all()透過 await 關鍵字等待所有 Promise。當從promise.all()呼叫 del 函式時,輸出是一個錯誤,拒絕訊息為“post deleted”。

示例 2

<html>
   <h2> Using the Promise.all() Method with async-await</h2>
<body>
   <p id="output"> </p>
   <script>
      let post = () => {
         return new Promise((resolve, reject) => {
            resolve("blog posted");
         });
      };
      let progress = () => {
         return new Promise((resolve, reject) => {
            resolve("blog in progress");
         })
      };
      let del = () => {
         return new Promise((resolve, reject) => {
            reject("rejected promise");
         });
      };
      let blog_promise = async () => {
         try {
            let result = await Promise.all([progress(), post(), del()]);
            document.getElementById("output").innerHTML = result
         } catch (error) {
            document.getElementById("output").innerHTML = error
         }
      }
      blog_promise();
   </script>
</body>
</html>

我們學習了在 JavaScript 中使用 async-await 關鍵字的 promise.all() 的工作原理。本教程討論了它們的使用方法以及兩個實際案例,一個關於所有 Promise 都已 fulfilled 的情況,另一個關於 Promise 被拒絕的情況。

更新於:2022-12-29

5K+ 次瀏覽

啟動你的職業生涯

完成課程後獲得認證

開始學習
廣告
© . All rights reserved.