Promise 静态方法详解与示例
Promise 静态方法概述
Promise 提供了多个强大的静态方法来处理异步操作,这些方法可以高效地管理多个 Promise 实例。
方法详解与代码示例
1. Promise.resolve(value)
创建一个立即解析为给定值的 Promise 对象。
// 使用 Promise.resolve 创建已解析的 Promise
const resolvedPromise = Promise.resolve('成功解析的值');
resolvedPromise.then(value => {
console.log('Promise.resolve 示例:', value);
// 输出: Promise.resolve 示例: 成功解析的值
});
2. Promise.reject(reason)
创建一个立即拒绝的 Promise 对象,带有给定的原因。
// 使用 Promise.reject 创建已拒绝的 Promise
const rejectedPromise = Promise.reject('操作失败的原因');
rejectedPromise.catch(error => {
console.log('Promise.reject 示例:', error);
// 输出: Promise.reject 示例: 操作失败的原因
});
3. Promise.all(iterable)
当所有 Promise 都成功时返回结果数组,任一 Promise 失败则立即拒绝。
// 模拟异步任务
const task1 = new Promise(resolve => setTimeout(() => resolve('任务1完成'), 600));
const task2 = new Promise(resolve => setTimeout(() => resolve('任务2完成'), 400));
const task3 = new Promise(resolve => setTimeout(() => resolve('任务3完成'), 800));
// 全部成功的场景
Promise.all([task1, task2, task3])
.then(results => {
console.log('Promise.all 成功:', results);
// 输出: ['任务1完成', '任务2完成', '任务3完成']
});
// 包含一个失败的场景
const failingTask = Promise.reject('任务失败');
Promise.all([task1, task2, failingTask])
.catch(error => {
console.log('Promise.all 失败:', error);
// 输出: Promise.all 失败: 任务失败
});
4. Promise.race(iterable)
返回最先完成的 Promise(无论成功或失败)。
// 创建不同响应时间的 Promise
const fastPromise = new Promise(resolve => setTimeout(() => resolve('快速任务'), 300));
const mediumPromise = new Promise(resolve => setTimeout(() => resolve('中速任务'), 600));
const slowPromise = new Promise((_, reject) => setTimeout(() => reject('慢速任务失败'), 900));
// 第一个完成的 Promise
Promise.race([fastPromise, mediumPromise, slowPromise])
.then(result => {
console.log('Promise.race 成功:', result);
// 输出: Promise.race 成功: 快速任务
});
// 包含失败任务的场景
const failingFast = new Promise((_, reject) => setTimeout(() => reject('快速失败'), 200));
Promise.race([failingFast, mediumPromise, slowPromise])
.catch(error => {
console.log('Promise.race 失败:', error);
// 输出: Promise.race 失败: 快速失败
});
5. Promise.allSettled(iterable)
所有 Promise 完成后返回结果数组(包含状态和值)。
// 混合成功和失败的 Promise
const success1 = Promise.resolve('成功1');
const success2 = new Promise(resolve => setTimeout(() => resolve('成功2'), 500));
const failure1 = Promise.reject('失败1');
const failure2 = new Promise((_, reject) => setTimeout(() => reject('失败2'), 300));
Promise.allSettled([success1, success2, failure1, failure2])
.then(results => {
console.log('Promise.allSettled 结果:');
results.forEach((result, index) => {
console.log(`任务${index + 1}:`,
result.status === 'fulfilled'
? `成功 - ${result.value}`
: `失败 - ${result.reason}`
);
});
/*
输出:
任务1: 成功 - 成功1
任务2: 成功 - 成功2
任务3: 失败 - 失败1
任务4: 失败 - 失败2
*/
});
6. Promise.any(iterable)
任一 Promise 成功时返回其值,全部失败时返回聚合错误。
// 创建多个可能失败的任务
const failingFast = new Promise((_, reject) => setTimeout(() => reject('快速失败'), 200));
const failingMedium = new Promise((_, reject) => setTimeout(() => reject('中速失败'), 400));
const slowSuccess = new Promise(resolve => setTimeout(() => resolve('慢速成功'), 800));
// 包含成功任务的场景
Promise.any([failingFast, failingMedium, slowSuccess])
.then(result => {
console.log('Promise.any 成功:', result);
// 输出: Promise.any 成功: 慢速成功
});
// 全部失败的场景
const anotherFailure = new Promise((_, reject) => setTimeout(() => reject('另一个失败'), 500));
Promise.any([failingFast, failingMedium, anotherFailure])
.catch(error => {
console.log('Promise.any 全部失败:');
console.log('错误名称:', error.name); // AggregateError
console.log('错误信息:', error.message); // All promises were rejected
console.log('所有错误原因:', error.errors);
// 输出: ['快速失败', '中速失败', '另一个失败']
});
方法对比表
方法 | 描述 | 成功条件 | 失败条件 | 返回结果 |
---|---|---|---|---|
Promise.all() | 所有 Promise 成功 | 全部成功 | 任一失败 | 成功值数组 |
Promise.race() | 第一个完成的 Promise | 第一个成功 | 第一个失败 | 第一个完成的值 |
Promise.allSettled() | 所有 Promise 完成 | 不适用 | 不适用 | 包含状态和结果的对象数组 |
Promise.any() | 任一 Promise 成功 | 任一成功 | 全部失败 | 第一个成功的值 |
实际应用场景
关键知识点总结
-
Promise.resolve:
- 创建立即解析的 Promise
- 可用于将同步值转换为 Promise
-
Promise.reject:
- 创建立即拒绝的 Promise
- 适用于明确需要错误结果的场景
-
Promise.all:
- 并行执行多个异步任务
- 所有任务必须成功,适合相互依赖的操作
-
Promise.race:
- 获取最先完成的任务结果
- 常用于超时处理
-
Promise.allSettled:
- 获取所有任务的最终状态
- 无论成功或失败都返回结果
-
Promise.any:
- 获取第一个成功的任务
- 全部失败时返回聚合错误