在 JavaScript 异步编程的世界里,Promise
对象扮演着举足轻重的角色。它为我们处理异步操作提供了一种优雅而强大的方式,避免了回调地狱带来的困扰。除了使用 new Promise()
构造函数创建 Promise
实例之外,JavaScript 还提供了多个静态方法来创建 Promise
对象,这些静态方法各有特点,能满足不同的业务需求。下面,我们就来详细介绍这些静态方法。
Promise.resolve()
Promise.resolve()
方法会返回一个已解决(resolved)状态的 Promise
对象。它可以接受不同类型的参数,根据参数的不同会有不同的处理方式:
Promise
对象,那么 Promise.resolve()
会原封不动地返回这个 Promise
对象。then
方法的对象(通常称为 thenable
对象),Promise.resolve()
会将这个对象转换为一个 Promise
对象,并根据 thenable
对象的状态来决定新 Promise
对象的状态。Promise.resolve()
会创建一个新的 Promise
对象,并将这个值作为其解决值。
// 传入普通值
const resolvedPromise1 = Promise.resolve(42);
resolvedPromise1.then((value) => {
console.log('resolvedPromise1 的值:', value); // 输出: resolvedPromise1 的值: 42
});
// 传入 thenable 对象
const thenable = {
then: function(resolve, reject) {
resolve('Hello, thenable!');
}
};
const resolvedPromise2 = Promise.resolve(thenable);
resolvedPromise2.then((value) => {
console.log('resolvedPromise2 的值:', value); // 输出: resolvedPromise2 的值: Hello, thenable!
});
// 传入 Promise 对象
const originalPromise = new Promise((resolve) => {
resolve('Original Promise');
});
const resolvedPromise3 = Promise.resolve(originalPromise);
resolvedPromise3.then((value) => {
console.log('resolvedPromise3 的值:', value); // 输出: resolvedPromise3 的值: Original Promise
});
Promise.reject()
Promise.reject()
方法会返回一个已拒绝(rejected)状态的 Promise
对象,其拒绝原因就是传入的参数。与 Promise.resolve()
不同,无论传入的参数是什么类型,Promise.reject()
都会直接将其作为拒绝原因,不会进行额外的处理。
const rejectedPromise = Promise.reject(new Error('这是一个拒绝原因'));
rejectedPromise.catch((error) => {
console.log('拒绝原因:', error.message); // 输出: 拒绝原因: 这是一个拒绝原因
});
Promise.all()
Promise.all()
方法接收一个可迭代对象(通常是数组)作为参数,该可迭代对象中的每个元素都是一个 Promise
对象。它会返回一个新的 Promise
对象,这个新的 Promise
对象的状态取决于传入的所有 Promise
对象的状态:
Promise
对象都成功解决时,新的 Promise
对象才会成功解决,其解决值是一个数组,数组中的元素按照传入的 Promise
对象的顺序排列,分别是每个 Promise
对象的解决值。Promise
对象被拒绝,新的 Promise
对象就会立即被拒绝,其拒绝原因就是第一个被拒绝的 Promise
对象的拒绝原因。
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log('Promise.all 的解决值:', values); // 输出: Promise.all 的解决值: [1, 2, 3]
});
const promise4 = Promise.resolve(4);
const promise5 = Promise.reject(new Error('Promise 5 被拒绝'));
const promise6 = Promise.resolve(6);
Promise.all([promise4, promise5, promise6]).catch((error) => {
console.log('Promise.all 的拒绝原因:', error.message); // 输出: Promise.all 的拒绝原因: Promise 5 被拒绝
});
Promise.race()
Promise.race()
方法同样接收一个可迭代对象(通常是数组)作为参数,该可迭代对象中的每个元素都是一个 Promise
对象。它会返回一个新的 Promise
对象,这个新的 Promise
对象的状态取决于传入的 Promise
对象中最先改变状态的那个:
Promise
对象是成功解决的,那么新的 Promise
对象也会成功解决,其解决值就是最先解决的 Promise
对象的解决值。Promise
对象是被拒绝的,那么新的 Promise
对象也会被拒绝,其拒绝原因就是最先被拒绝的 Promise
对象的拒绝原因。
const promise7 = new Promise((resolve) => {
setTimeout(() => {
resolve('Promise 7 解决');
}, 1000);
});
const promise8 = new Promise((resolve) => {
setTimeout(() => {
resolve('Promise 8 解决');
}, 500);
});
Promise.race([promise7, promise8]).then((value) => {
console.log('Promise.race 的解决值:', value); // 输出: Promise.race 的解决值: Promise 8 解决
});
const promise9 = new Promise((reject) => {
setTimeout(() => {
reject(new Error('Promise 9 被拒绝'));
}, 300);
});
const promise10 = new Promise((resolve) => {
setTimeout(() => {
resolve('Promise 10 解决');
}, 600);
});
Promise.race([promise9, promise10]).catch((error) => {
console.log('Promise.race 的拒绝原因:', error.message); // 输出: Promise.race 的拒绝原因: Promise 9 被拒绝
});
Promise.allSettled()
Promise.allSettled()
方法接收一个可迭代对象(通常是数组)作为参数,该可迭代对象中的每个元素都是一个 Promise
对象。它会返回一个新的 Promise
对象,这个新的 Promise
对象会在所有传入的 Promise
对象都完成(无论是解决还是拒绝)后才会解决,其解决值是一个数组,数组中的每个元素都是一个对象,描述了每个传入的 Promise
对象的最终状态,对象包含两个属性:
status
:值为 'fulfilled'
或 'rejected'
,表示 Promise
对象的最终状态。value
或 reason
:如果 status
为 'fulfilled'
,则 value
属性包含 Promise
对象的解决值;如果 status
为 'rejected'
,则 reason
属性包含 Promise
对象的拒绝原因。
const promise11 = Promise.resolve('Promise 11 解决');
const promise12 = Promise.reject(new Error('Promise 12 被拒绝'));
Promise.allSettled([promise11, promise12]).then((results) => {
console.log('Promise.allSettled 的解决值:', results);
/* 输出:
[
{ status: 'fulfilled', value: 'Promise 11 解决' },
{ status: 'rejected', reason: Error: Promise 12 被拒绝 }
]
*/
});
静态方法 | 功能 | 特点 |
---|---|---|
Promise.resolve() |
返回一个已解决状态的 Promise 对象 |
根据传入参数类型不同有不同处理方式 |
Promise.reject() |
返回一个已拒绝状态的 Promise 对象 |
直接将传入参数作为拒绝原因 |
Promise.all() |
所有传入的 Promise 对象都成功解决时,新 Promise 对象才成功解决;有一个被拒绝则新 Promise 对象立即被拒绝 |
解决值是包含所有 Promise 对象解决值的数组 |
Promise.race() |
新 Promise 对象的状态取决于传入的 Promise 对象中最先改变状态的那个 |
最先改变状态的 Promise 对象决定新 Promise 对象的状态 |
Promise.allSettled() |
所有传入的 Promise 对象都完成后,新 Promise 对象才解决 |
解决值是包含每个 Promise 对象最终状态信息的数组 |
通过这些静态方法,我们可以更加灵活地处理多个异步操作,根据不同的业务场景选择合适的方法,让异步编程变得更加简洁和高效。希望大家在实际开发中能够熟练运用这些方法,提升代码的质量和可维护性。