Promise 是 JavaScript 中用于处理异步操作的对象,它代表一个尚未完成但预期会在未来完成(或失败)的操作及其结果。
核心概念
三种状态
- Pending(进行中) - 初始状态
- Fulfilled(已成功) - 操作成功完成
- Rejected(已失败) - 操作失败
基本语法
const promise = new Promise((resolve, reject) => {
// 异步操作
if (/* 操作成功 */) {
resolve(value); // 状态变为 fulfilled
} else {
reject(error); // 状态变为 rejected
}
});
使用方法
1. then() - 处理成功结果
promise.then(
(result) => {
console.log('成功:', result);
},
(error) => {
console.log('失败:', error);
}
);
2. catch() - 处理失败情况
promise
.then(result => console.log(result))
.catch(error => console.error(error));
3. finally() - 无论成功失败都执行
promise
.then(result => console.log(result))
.catch(error => console.error(error))
.finally(() => console.log('操作完成'));
实际示例
// 模拟异步请求
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const success = Math.random() > 0.3;
if (success) {
resolve({ data: '用户数据' });
} else {
reject(new Error('请求失败'));
}
}, 1000);
});
}
// 使用 Promise
fetchData()
.then(response => {
console.log('获取数据:', response.data);
return response.data;
})
.catch(error => {
console.error('错误:', error.message);
});
Promise 的静态方法
Promise.all() - 所有 Promise 都成功
const p1 = Promise.resolve(1);
const p2 = Promise.resolve(2);
const p3 = Promise.resolve(3);
Promise.all([p1, p2, p3])
.then(values => console.log(values)); // [1, 2, 3]
Promise.race() - 最先完成的 Promise
const fast = new Promise(resolve => setTimeout(() => resolve('快'), 100));
const slow = new Promise(resolve => setTimeout(() => resolve('慢'), 500));
Promise.race([fast, slow])
.then(result => console.log(result)); // "快"
Promise.allSettled() - 所有 Promise 都完成(无论成功失败)
Promise.any() - 第一个成功的 Promise
链式调用(避免回调地狱)
// 回调地狱示例
doSomething(function(result) {
doSomethingElse(result, function(newResult) {
doThirdThing(newResult, function(finalResult) {
console.log(finalResult);
});
});
});
// Promise 链式调用
doSomething()
.then(result => doSomethingElse(result))
.then(newResult => doThirdThing(newResult))
.then(finalResult => console.log(finalResult))
.catch(error => console.error(error));
为什么需要 Promise?
- 避免回调地狱 - 代码更扁平,易于阅读
- 更好的错误处理 - 统一的错误处理机制
- 可组合性 - 多个异步操作可以方便地组合
- 状态不可变 - Promise 状态一旦改变就不会再变
现代替代方案
虽然 Promise 解决了回调地狱,但 ES2017 引入了更简洁的语法:
// 使用 async/await
async function getUserData() {
try {
const user = await fetchUser();
const posts = await fetchPosts(user.id);
return { user, posts };
} catch (error) {
console.error('获取数据失败:', error);
}
}
Promise 是现代 JavaScript 异步编程的基础,async/await 语法糖也是基于 Promise 实现的。