hand
_1_11_140
4
返回栏目
0k
2k
1k
2k
1k
1k
1k
2k
2k
2k
1k
2k
1k
2k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
2k
1k
1k
2k
2k
2k
3k
3k
2k
3k
2k
3k
3k
3k
1k
2k
3k
2k
2k
3k
3k
2k
2k
6k
3k
2k
2k
5k
3k
4k
3k
3k
2k
4k
3k
3k
2k
3k
3k
1k
4k
4k
4k
2k
5k
3k
2k
3k
4k
3k
3k
4k
2k
3k
3k
4k
2k
2k
3k
4k
3k
3k
2k
5k
2k
3k
3k
3k
3k
2k
3k
3k
3k
2k
2k
2k
2k
3k
2k
2k
2k
3k
2k
2k
2k
2k
2k
2k
0.1k
0.2k
3k
2k
3k
2k
0.1k
2k
2k
4k
2k
2k
1k
2k
2k
3k
3k
3k
3k
2k
2k
3k
3k
3k
4k
3k
3k
4k
3k
2k
2k
3k
3k
3k
3k
3k
3k
2k
3k
3k
4k
4k
3k
3k
2k
2k
3k
2k
2k
1k
2k
3k
1k
2k
2k
2k
2k
2k
2k
2k
2k
2k
4k
2k
3k
2k
1k
2k
2k
2k
2k
2k
3k
2k
3k
1k
2k
2k
2k
0k
2k
2k
2k
2k
2k
2k
2k
3k
2k
2k
1k
1k
3k
2k
3k
1k
2k
1k
2k
2k
2k
2k
3k
1k
3k
2k
2k
2k
2k
2k
2k
1k
2k
2k
4k
3k
3k
2k
2k
2k
2k
2k
2k
4k
3k
3k
3k
2k
2k
2k
2k
2k
2k
3k
4k
返回前端 - Javascript栏目
作者:
贺及楼
成为作者
更新日期:2025-02-21 20:05:28
在 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 对象最终状态信息的数组 |
通过这些静态方法,我们可以更加灵活地处理多个异步操作,根据不同的业务场景选择合适的方法,让异步编程变得更加简洁和高效。希望大家在实际开发中能够熟练运用这些方法,提升代码的质量和可维护性。
前端 - Javascript
整章节共299节
快分享给你的小伙伴吧 ~