如何在 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 等庫。