在 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 对象最终状态信息的数组 |
通过这些静态方法,我们可以更加灵活地处理多个异步操作,根据不同的业务场景选择合适的方法,让异步编程变得更加简洁和高效。希望大家在实际开发中能够熟练运用这些方法,提升代码的质量和可维护性。