首页 >web前端 >js教程 >Promise.all() 如何高效处理多个异步任务,然后再进行后续操作?

Promise.all() 如何高效处理多个异步任务,然后再进行后续操作?

Patricia Arquette
Patricia Arquette原创
2024-12-15 19:19:15840浏览

How Can Promise.all() Efficiently Handle Multiple Asynchronous Tasks Before Proceeding to Subsequent Operations?

异步处理多个 Promise

本文旨在解决在循环内执行多个异步任务的挑战以及确保其完成的需要在继续后续任务之前。

问题:处理异步任务循环

想象一个场景,其中循环迭代一组任务,每个任务都是异步执行的。在该循环之后,另一个循环依赖于第一个循环任务的完成。我们怎样才能有效地实现这种协调?

Promises 和 Promise.all()

Promises 为这个问题提供了一个优雅的解决方案。通过从 doSomeAsyncStuff() 返回一个 Promise,我们可以管理异步操作。

Promise.all() 是一个强大的方法,它接受一组 Promise 并返回单个 Promise。只有当所有输入的 Promise 都得到解决或者其中任何一个被拒绝时,这个单一的 Promise 才会得到解决。

实现

为了实现我们的目标,我们可以利用 Promise.all() 如下:

const promises = [];

for (let i = 0; i < 5; i++) {
  promises.push(doSomeAsyncStuff());
}

Promise.all(promises)
  .then(() => {
    // Execute tasks that require all async tasks to finish
  })
  .catch((e) => {
    // Handle errors
  });

在此实现中,我们将所有 Promise 收集到一个数组中并将其传递给 Promise.all()。在解决(或拒绝)后,我们继续执行第二个循环的任务。

其他注意事项

  • 为了更加清晰,请使用 const 或 let 而不是 var。
  • 考虑使用 catch 方法处理错误。
  • 要进一步了解,请参阅 MDN 关于 Promise 的文档和我的书“JavaScript:新玩具”(我的个人资料中提供了链接)。

示例

以下示例演示了如何利用 Promise.all() 等待多个异步任务完成完成:

function doSomethingAsync(value) {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("Resolving " + value);
      resolve(value);
    }, Math.floor(Math.random() * 1000));
  });
}

function test() {
  const promises = [];

  for (let i = 0; i < 5; i++) {
    promises.push(doSomethingAsync(i));
  }

  Promise.all(promises)
    .then((results) => {
      console.log("All done", results);
    })
    .catch((e) => {
      // Handle errors
    });
}

test();

以上是Promise.all() 如何高效处理多个异步任务,然后再进行后续操作?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn