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