Promise是js中处理异步操作的核心解决方案,用于解决传统回调函数的“回调地狱”问题。它代表一个异步操作的最终完成(或失败)及其结果值。
一、Promise的三个状态
1.Pending(进行中)
初始状态,既未功也未失败
2.Fulfilled(已成功)
操作成功完成,调用resolve()
3.Rejected(已失败)
操作失败,调用reject()
状态一旦改变就变得不可逆(Pending->Fulfilled或Pending->Rejected)
二、基本用法
const promise = new Promise((resolve, reject) => {
// 异步操作(如 API 请求、定时器等)
if (/* 成功条件 */) {
resolve("操作成功"); // 状态变为 Fulfilled
} else {
reject("操作失败"); // 状态变为 Rejected
}
});
// 处理结果
promise
.then(result => console.log(result)) // 成功时执行
.catch(error => console.error(error)) // 失败时捕获
.finally(() => console.log("无论成败都会执行"));
三、核心方法
| 方法 | 作用 | 链式调用 |
|---|---|---|
| .then() | 处理成功状态 | 可返回新的Promise |
| .catch() | 捕获错误 | 可捕获链中任意错误 |
| .finally() | 无论成功失败都执行 | 不接受参数 |
四、静态方法
1.Promise.resolve()
快速创建成功状态的Promise
Promise.resolve("成功").then(console.log); // "成功"
2.Promise.reject()
快速创建失败状态的Promise
Promise.reject("失败").catch(console.error); // "失败"
3.Promise.all([p1,p2])
所有Promise成功才算成功
Promise.all([promise1, promise2])
.then(results => console.log(results)) // [result1, result2]
.catch(error => console.log("第一个失败的错误"));
4.Promise.race([p1,p2])
取得先完成的Promise结果(无论成败)
Promise.race([api1, api2])
.then(firstResult => console.log(firstResult));
5.Promise.allSettled([p1,p2])
等待所有Promise完成(无论成败)
Promise.allSettled([p1, p2])
.then(results => results.forEach(r => console.log(r.status)));
6.Promise.any([p1,p2])
取第一个成功的Promise
Promise.any([p1, p2])
.then(firstSuccess => console.log(firstSuccess));
五、链式调用(解决回调地狱)
fetchData()
.then(processData)
.then(saveData)
.then(result => {
console.log("最终结果:", result);
})
.catch(error => {
console.error("链中任意错误:", error);
});
六、错误处理要点
1.隐式捕获
Promise会自动捕获同步错误
new Promise((resolve, reject) => {
throw new Error("自动被 catch 捕获");
}).catch(console.error);
2.推荐写法
总是用.catch()结尾,避免未处理错误
七、Async/Await(基于Promise的语法糖)
async function fetchUser() {
try {
const user = await getUser(); // 等待 Promise 完成
const posts = await getPosts(user.id);
console.log(posts);
} catch (error) {
console.error("统一捕获错误", error);
} finally {
console.log("请求结束");
}
}
代码更接近同步逻辑,错误处理更直观
八、常见误区
1.忘记return
.then(() => {
newPromise(); // 错误!需 return
})
2.嵌套.then(重回回调地狱)
.then(a => {
getB(a).then(b => { /* 避免这种嵌套 */ })
})