如何在 JavaScript 中按順序執行給定的 Promise 陣列?


JavaScript 中,有一個名為 "Promise.all" 的方法允許你並行執行 Promise 陣列。但是,有時你可能希望按順序執行你的 Promise。如果你想確保每個 Promise 一個接一個地執行,或者你需要在下一個 Promise 的執行中使用一個 Promise 的結果,這將非常有用。

在 JavaScript 中,有幾種不同的方法可以按順序執行 Promise 陣列。在本文中,我們將介紹其中的一些方法。

Promise.prototype.then()

按順序執行 Promise 陣列的一種方法是使用 then() 方法將它們連結在一起。此方法將一個函式作為輸入,該函式將在 Promise fulfilled 後執行。

示例

<html>
<head>
   <title>Examples</title>
</head>
<body>
   <div id="result1"></div>
   <div id="result2"></div>
   <div id="result3"></div>
   <script>
      Promise.resolve(1) .then(result => {
         document.getElementById("result1").innerHTML = result
         return Promise.resolve(2);
      }) .then(result => {
          document.getElementById("result2").innerHTML = result
         return Promise.resolve(3);
      }) .then(result => {
          document.getElementById("result3").innerHTML = result
      });  
   </script>
</body>
</html>

如你所見,我們正在使用 **then()** 方法將三個 Promise 連結在一起。第一個 Promise 解析為值 1,該值將被顯示。第二個 Promise 解析為值 2,該值也將被顯示。最後,第三個 Promise 解析為值 3,該值也將被顯示。

因為 "then" 方法返回一個 Promise,所以我們可以以這種方式將 Promise 連結在一起以建立一個序列。

for-await-of

按順序執行 Promise 陣列的另一種方法是使用 "for-await-of" 迴圈。此迴圈允許你在 for 迴圈內使用 await 關鍵字。await 關鍵字會暫停程式碼的執行,直到 Promise fulfilled。

示例

以下是一個示例 -

<html>
<head>
   <title>Example- for-await-of</title>
</head>
<body>
   <script>
      async function runPromisesInSeries() {
         for await (const promise of [
            Promise.resolve(1),
            Promise.resolve(2),
            Promise.resolve(3),
         ]) {
               const result = await promise;
               document.write(result);
               document.write("<br>")
            }
         }
      runPromisesInSeries();
   </script>
</body>
</html>

在此示例中,我們有一個包含 "for-await-of" 迴圈的非同步函式。此迴圈迭代 Promise 陣列。對於陣列中的每個 Promise,我們等待 Promise fulfilled。Promise fulfilled 後,將顯示其值。

使用庫

如果你需要比原生 Promise API 提供的功能更多的功能,可以使用 Bluebird 或 Q 等庫。這些庫提供了用於處理 Promise 的其他方法。

例如,Bluebird 提供了一個 "map" 方法,它允許你將值陣列對映到 Promise 陣列,然後等待所有 Promise fulfilled -

const Promise = require('bluebird');

Promise.map([1, 2, 3], x => {
   return Promise.resolve(x * 2);
}).then(results => {
   console.log(results); // [2, 4, 6]
});

結論

在本文中,我們看到了在 JavaScript 中按順序執行 Promise 陣列的幾種不同方法。我們已經瞭解瞭如何使用 "then" 方法將 Promise 連結在一起,如何使用 "for-await-of" 迴圈,以及如何使用 Bluebird 或 Q 等庫。

更新於: 2022-07-01

915 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告