Promise.all的注意事项

星期一, 9月 30, 2024 | 1分钟阅读 | 更新于 星期一, 9月 30, 2024

@

Promise.all()的定义

  • Promise.all() 接收一个可迭代对象(例如数组)作为参数,该对象包含多个 Promise。它会返回一个新的 Promise,当且仅当传入的所有 Promise 都成功时,返回的 Promise 才会被解析(fulfilled),并且返回一个包含每个 Promise 成功结果的数组。
  • 如果其中有任何一个 Promise 失败(rejected),整个 Promise.all() 返回的 Promise 会立即失败,并抛出第一个失败 Promise 的错误。其他 Promise 即使还在进行中,也会被忽略

注意点

当抛出第一个失败时,其他的promise中的代码是直接停止还是还会继续执行呢?答案是继续执行,只是它的promsie的值不会被promsie.all 所接受。 示例代码:

const promise1 = new Promise((resolve, reject) => {
    setTimeout(() => {
        reject('failed on promise1');
    }, 1000);
});
const promise2 = new Promise((resolve, reject) => {
    setTimeout(() => {
        console.log('虽然被丢弃,依然执行1')
        resolve('succeed on promise2');
        console.log('虽然被丢弃,依然执行2')
    }, 2000);
});
Promise.all([promise1, promise2]).then((res) => {
    console.log('all promise.then', res);
}).catch((err) => {
    console.error('all promise.catch ', err);
}).finally(()=>{
    console.log('all promise.finally ');
});

上面的执行结果是:

`all promise.catch  failed on promise1`
`all promise.finally `
`虽然被丢弃,依然执行1`
`虽然被丢弃,依然执行2`

有趣吧,结论是Promise.all中某一个失败并不能阻止剩余promise的执行(只是结果被丢弃)。所以如果我们想在所有的promsie都settled(拒绝或者成功),应该使用:Promise.allSettled,然后再根据promsie的结果判断执行相应的逻辑。

© 2016 - 2025 Jebben 开发日志&网络随笔

🌱 Powered by Hugo with theme Dream.

关于博主

自我介绍

大家好,我是 Jabin,一名拥有 8 年工作经验的前端工程师。我是一个自学成才的开发者,通过不断学习和实践,积累了丰富的 web 端开发经验以及在 B 端后台管理、监控和 C 端教育、媒体类项目方面的丰富经验。

关于我的技能

我精通多种前端技术,包括但不限于:

  • JavaScript 和 TypeScript:我熟练掌握 JavaScript 和 TypeScript,能够利用它们构建出色的前端应用程序。
  • CSS:我对 CSS 有深入的理解,能够编写出美观、响应式的样式。
  • 前端框架:我熟练使用 Angular、React、Vue 和 Next.js 等前端框架,能够根据项目需求灵活选择并应用合适的技术栈。
  • 前端工具:我熟悉 webpack、Vite 等常用的前端打包工具,以及框架配套的 CLI 工具,能够高效地进行项目开发和部署。
  • 后端技术:我了解服务端语言 Java 和 Node.js,并能够与后端开发人员紧密合作,实现完整的应用程序。
  • 数据库和操作系统:我熟悉 SQL 数据库和 Linux 操作系统的常见操作和命令,能够进行数据库管理和服务器配置。

我的项目经验

我曾主导多个从零到一的项目,参与过数百万 UV 项目的开发,具有丰富的项目开发与团队合作经验。

我对技术充满热情,喜欢钻研新技术和解决复杂的技术问题。我还积极参与开源社区,贡献自己的力量,与各地的开发者共同探索和分享技术前沿。

结语

我是一个对技术认真负责、可靠可靠的人,热爱挑战和创新。我希望通过我的个人网站,与更多志同道合的人分享我的经验和见解,共同推动前端技术的发展和进步。

欢迎来到我的个人网站,期待与您的交流和合作!