promise.all() 的作用和应用场景

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;优快云知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技术开发,欢迎加底部微信(gis-dajianshi),一起交流。

在这里插入图片描述

No.大剑师精品GIS教程推荐
0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】
1Openlayers 【入门教程】 - 【源代码+示例 300+】
2Leaflet 【入门教程】 - 【源代码+图文示例 150+】
3MapboxGL【入门教程】 - 【源代码+图文示例150+】
4Cesium 【入门教程】 - 【源代码+综合教程 200+】
5threejs【中文API】 - 【源代码+图文示例200+】
6Shader 编程 【图文示例 100+】
7Geoserver 【配置教程 100+】
8卫星应用开发教程 【配置+应用教程 100+】
9GIS数字孪生与大模型 【应用实战 100+】
10报表与数字大屏 【Echarts 实战示例】 - 【D3 综合教程】 - 【其他大屏】

在这里插入图片描述

Promise.all() 是 JavaScript 中 Promise 对象的一个静态方法,它接收一个可迭代对象(通常是一个 Promise 对象数组),并返回一个新的 Promise 实例。当传入的 Promise 都变为 fulfilled(已成功)状态时,返回的新 Promise 也会 fulfilled,其结果是一个数组,包含了各个 Promise 成功的结果;但如果传入的 Promise 中有任何一个变为 rejected(已失败)状态,那么返回的新 Promise 立即变为 rejected 状态,并返回第一个被 reject 的 Promise 的拒绝原因。

一、作用

  • 并发执行多个异步操作并在所有操作都成功时获取所有结果。
  • 快速失败(fail-fast)机制,任何一个 Promise 失败则整体失败。
  • 可以用来协调多个异步任务,使得它们能够有序且同时完成。

二、应用场景

  • 数据的批量获取:例如从不同 API 下载多个资源,只有当所有资源都下载完成后才执行下一步操作。
  • 登录时验证用户名和密码同时是否有效。
  • 在多个异步依赖项都满足时初始化应用或模块。

三、代码示例

// 示例1:获取多个异步结果
let promise1 = fetch('https://api.example.com/data1');
let promise2 = fetch('https://api.example.com/data2');
let promise3 = fetch('https://api.example.com/data3');

Promise.all([promise1, promise2, promise3])
  .then(responses => Promise.all(responses.map(r => r.json()))) // 先将响应转成 JSON 格式
  .then(dataArrays => {
    // dataArrays 是一个数组,包含了三个 API 调用的结果
    let [data1, data2, data3] = dataArrays;
    console.log(data1, data2, data3);
  })
  .catch(error => {
    // 如果任何一项请求失败,这里会捕获到错误
    console.error('至少有一个请求失败:', error);
  });

// 示例2:并发读取多个文件
let readFilePromises = ['file1.txt', 'file2.txt', 'file3.txt'].map(fileName =>
  fs.promises.readFile(fileName, 'utf8')
);

Promise.all(readFilePromises)
  .then(contents => {
    // contents 是一个包含文件内容的数组
    for (const content of contents) {
      console.log(content);
    }
  })
  .catch(err => {
    console.error('读取文件时出错', err);
  });

在这个例子中,Promise.all 保证了所有文件读取操作都是并发进行的,并且只有当所有文件都成功读取完毕,才会执行 .then 中的回调函数。如果其中任意一个文件读取失败,.catch 中的回调函数会被调用。

Promise.allPromise.allSettled是两种不同的Promise方法,它们在使用场景返回结果上有所不同。 1. Promise.all: - 使用场景:当需要等待多个Promise对象都完成后再执行后续操作时,可以使用Promise.all。 - 返回结果:返回一个新的Promise对象,Promise对象在所有给定的Promise对象都已经fulfilled后才会fulfilled,如果其中任何一个Promise对象被rejected,则返回的Promise对象会立即被rejected。 - 示例代码: ```javascript const promise1 = Promise.resolve(1); const promise2 = Promise.resolve(2); const promise3 = Promise.resolve(3); Promise.all([promise1, promise2, promise3]) .then(values => { console.log(values); // 输出:[1, 2, 3] }) .catch(error => { console.log(error); // 如果有任何一个Promise对象被rejected,则会执行这里的代码 }); ``` 2. Promise.allSettled: - 使用场景:当需要等待多个Promise对象都完成后,无论是fulfilled还是rejected,都需要获取每个Promise对象的结果时,可以使用Promise.allSettled。 - 返回结果:返回一个新的Promise对象,该Promise对象在所有给定的Promise对象都已经fulfilled或rejected后才会fulfilled,返回的Promise对象带有一个对象数组,每个对象表示对应的Promise对象的结果,包括状态(fulfilled或rejected)值。 - 示例代码: ```javascript const apiOne = function(id) { return new Promise((resolve, reject) => { resolve({ result: true, text: 1 }); }); }; const apiTwo = function(id) { return new Promise((resolve, reject) => { reject({ result: true, text: 2 }); }); }; Promise.allSettled([apiOne('one'), apiTwo('two')]) .then(results => { console.log(results); /* 输出: [ { status: 'fulfilled', value: { result: true, text: 1 } }, { status: 'rejected', reason: { result: true, text: 2 } } ] */ }) .catch(error => { console.log(error); }); ```
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是大剑师兰特

打赏一杯可口可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值