javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > js Promise.all 和 Promise.allSettled

深入理解JS中 Promise.all 和 Promise.allSettled 特性和区别应用场景分析

作者:sandwich_14

在 JavaScript 中,Promise.all 和 Promise.allSettled 是处理多个 Promise 的常用方法,它们都可以用于并发执行多个异步操作,但在行为、返回值和应用场景上有显著区别,本文将深入探讨它们的特性、区别以及如何在实际开发中选择合适的方法,感兴趣的朋友一起看看吧

深入理解 Promise.allPromise.allSettled:特性、区别与应用场景

在 JavaScript 中,Promise.allPromise.allSettled 是处理多个 Promise 的常用方法。它们都可以用于并发执行多个异步操作,但在行为、返回值和应用场景上有显著区别。本文将深入探讨它们的特性、区别以及如何在实际开发中选择合适的方法。

1. Promise.all 的特性

1.1 基本行为

1.2 返回值

1.3 示例

const promises = [
  Promise.resolve(1),
  Promise.resolve(2),
  Promise.reject('Error'),
];
Promise.all(promises)
  .then(results => console.log(results)) // 不会执行
  .catch(error => console.error(error)); // 输出: Error

1.4 适用场景

2. Promise.allSettled 的特性

2.1 基本行为

2.2 返回值

返回一个数组,数组中的每个元素是一个对象,包含以下属性:

2.3 示例

const promises = [
  Promise.resolve(1),
  Promise.resolve(2),
  Promise.reject('Error'),
];
Promise.allSettled(promises).then(results => {
  console.log(results);
});

输出:

[
  { status: 'fulfilled', value: 1 },
  { status: 'fulfilled', value: 2 },
  { status: 'rejected', reason: 'Error' }
]

2.4 适用场景

3. Promise.all 和 Promise.allSettled 的区别

特性Promise.allPromise.allSettled
对失败的处理任何一个 Promise 失败,立即抛出错误等待所有 Promise 完成,无论成功或失败
返回值成功时返回结果数组,失败时返回错误返回一个包含所有 Promise 状态的对象数组
返回值顺序严格按照传入的 Promise 顺序严格按照传入的 Promise 顺序
适用场景所有 Promise 必须成功需要知道所有 Promise 的最终状态
是否捕获失败的结果

特性Promise.allPromise.allSettled对失败的处理任何一个 Promise 失败,立即抛出错误等待所有 Promise 完成,无论成功或失败返回值成功时返回结果数组,失败时返回错误返回一个包含所有 Promise 状态的对象数组返回值顺序严格按照传入的 Promise 顺序严格按照传入的 Promise 顺序适用场景所有 Promise 必须成功需要知道所有 Promise 的最终状态是否捕获失败的结果否是

4. 返回值顺序的保证

无论是 Promise.all 还是 Promise.allSettled,它们的返回值都会严格按照传入的 Promise 顺序返回结果,无论这些 Promise 的实际完成顺序如何。

4.1 Promise.all 的顺序保证

示例:

const promises = [
  new Promise(resolve => setTimeout(() => resolve(1), 1000)), // 第1个
  new Promise(resolve => setTimeout(() => resolve(2), 500)),  // 第2个
  new Promise(resolve => setTimeout(() => resolve(3), 200)),  // 第3个
];
Promise.all(promises)
  .then(results => console.log(results)) // 输出: [1, 2, 3]
  .catch(error => console.error(error));

4.2 Promise.allSettled 的顺序保证

无论 Promise 是成功还是失败,Promise.allSettled 都会等待所有 Promise 完成,并按照传入的顺序返回结果。 示例:

const promises = [
  new Promise(resolve => setTimeout(() => resolve(1), 1000)), // 第1个
  new Promise((resolve, reject) => setTimeout(() => reject('Error'), 500)), // 第2个
  new Promise(resolve => setTimeout(() => resolve(3), 200)),  // 第3个
];
Promise.allSettled(promises)
  .then(results => console.log(results));

输出:

[
  { status: 'fulfilled', value: 1 }, // 第1个 Promise 的结果
  { status: 'rejected', reason: 'Error' }, // 第2个 Promise 的结果
  { status: 'fulfilled', value: 3 } // 第3个 Promise 的结果
]

5. 如何选择使用哪个方法?

5.1 使用 Promise.all

5.2 使用 Promise.allSettled

6. 实际应用示例

6.1 使用 Promise.all

const urls = ['/api/data1', '/api/data2', '/api/data3'];
const fetchData = async (url) => {
  const response = await fetch(url);
  return response.json();
};
try {
  const results = await Promise.all(urls.map(url => fetchData(url)));
  console.log('All requests succeeded:', results);
} catch (error) {
  console.error('One or more requests failed:', error);
}

6.2 使用 Promise.allSettled

const urls = ['/api/data1', '/api/data2', '/api/data3'];
const fetchData = async (url) => {
  try {
    const response = await fetch(url);
    return { status: 'fulfilled', value: await response.json() };
  } catch (error) {
    return { status: 'rejected', reason: error };
  }
};
const results = await Promise.allSettled(urls.map(url => fetchData(url)));
console.log('All requests completed:', results);

7. 总结

根据你的需求选择合适的方法,可以更高效地处理并发异步操作!

到此这篇关于深入理解JS中 Promise.all 和 Promise.allSettled 特性和区别应用场景分析的文章就介绍到这了,更多相关js Promise.all 和 Promise.allSettled内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文