Promise
含义:
Promise对象是一个构造函数。一旦创建它就会立即执行,不能中途取消
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。
有三种状态:pending初始,fulfilled成功,rejected失败,一旦发生,状态就会凝固,不会再变
1.创建 Promise
新建一个构造函数,两个参数,都是函数resolve(value),reject(error);
const promise = new Promise((resolve, reject) => {
// 异步操作
if (/* 成功条件 */) {
resolve(value); // 成功时调用
} else {
reject(error); // 失败时调用
}
});
2.实例方法
2.1then() - 处理 Promise 的成功状态
promise.then(
value => { /* 处理成功结果 */ },
);
2.2catch() - 处理 Promise 的失败状态
promise.catch(
error => { /* 处理错误 */ }
);
2.3finally() - 无论成功失败都会执行
promise.finally(
() => { /* 清理操作 */ }
);
3.静态方法
Promise.all()
- 等待所有 Promise 完成
适用场景:
- 需要等待多个不相关的异步操作全部完成
- 需要保持多个异步结果的顺序
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('The first promise has resolved');
resolve(10);
}, 1 * 1000);
});
const p2 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('The second promise has resolved');
resolve(20);
}, 2 * 1000);
});
const p3 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('The third promise has resolved');
resolve(30);
}, 3 * 1000);
});
Promise.all([p1, p2, p3]).then((results) => {
const total = results.reduce((p, c) => p + c);
//返回值是一个数组,包含所有输入 Promise 的 解析值(resolve values),且顺序与输入顺序一致
console.log(`Results:`,results);
console.log(`Total: ${total}`);
});
//返回的是 第一个被拒绝的 Promise 的原因(rejection reason)
const p1 = Promise.resolve(1);
const p2 = Promise.reject('Error occurred');
const p3 = Promise.resolve(3);
Promise.all([p1, p2, p3])
.catch(reason => {
console.log(reason); // "Error occurred"
});
注意,如果作为参数的 Promise 实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()的catch方法
Promise.allSettled()
- 等待所有 Promise 完成(无论成功失败)
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(10);
}, 1 * 1000);
});
const p2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject(20);
}, 2 * 1000);
});
Promise.allSettled([p1, p2])
.then((result) => {
console.log(result);
});
Promise.race()
- 返回第一个完成的 Promise
Promise.race([promise1, promise2, ...])
.then(value => { /* 第一个成功的 Promise */ })
.catch(error => { /* 第一个失败的 Promise */ });
Promise.any()
- 返回第一个成功的 Promise
Promise.any([promise1, promise2, ...])
.then(value => { /* 第一个成功的 Promise */ })
.catch(errors => { /* 所有 Promise 都失败 */ });
Promise.resolve()/reject() 创建已解决/拒绝的Promise
promise的练习题 juejin.cn/post/684490…