如何在 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 次查看

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告