JavaScript Promise 超通俗解释
Promise 是 JS 中专门用来处理异步操作的对象,它解决了传统回调函数的「回调地狱」问题,让异步代码(比如请求接口、读取文件、定时器)写起来像同步代码一样清晰、好维护。
简单说:Promise 就是一个"承诺" ------ 异步操作现在没结果,但未来一定会给你一个结果(成功/失败)。
1. Promise 的三种状态
Promise 一生只有 3 种状态,状态一旦改变就固定,不可逆:
- pending(等待中):初始状态,异步任务正在执行(比如接口还没返回、定时器还没到时间)
- fulfilled(已成功):异步任务执行成功,会返回结果
- rejected(已失败):异步任务执行失败,会返回错误
状态变化只有两种:
pending → fulfilled(成功)pending → rejected(失败)
2. 基础语法:创建和使用 Promise
① 创建 Promise
用 new Promise() 构造函数,里面包裹异步代码:
javascript
// 定义一个 Promise 函数
function waitTime(time) {
// 返回 Promise 对象
return new Promise((resolve, reject) => {
// 异步操作:定时器
setTimeout(() => {
if (time > 0) {
// ✅ 成功:调用 resolve,把结果传出去
resolve(`等待了 ${time} 毫秒,执行成功`);
} else {
// ❌ 失败:调用 reject,把错误传出去
reject("时间不能小于等于0");
}
}, time);
});
}
resolve:成功时调用,把状态改为fulfilledreject:失败时调用,把状态改为rejected
② 使用 Promise
用 .then() 接收成功结果,.catch() 捕获错误,.finally() 无论成功失败都会执行:
javascript
waitTime(2000)
.then((result) => {
// 成功回调:拿到 resolve 的数据
console.log(result); // 输出:等待了 2000 毫秒,执行成功
})
.catch((error) => {
// 失败回调:拿到 reject 的错误
console.error(error);
})
.finally(() => {
// 最终回调:无论成功/失败都执行(常用于关闭加载、清理操作)
console.log("异步操作结束");
});
3. 核心优势:解决回调地狱
传统异步嵌套(回调地狱,代码嵌套多层,可读性极差):
javascript
// 回调地狱 ❌
setTimeout(() => {
console.log("第一步");
setTimeout(() => {
console.log("第二步");
setTimeout(() => {
console.log("第三步");
}, 1000);
}, 1000);
}, 1000);
用 Promise 链式调用(扁平化,逻辑清晰):
javascript
// Promise 链式调用 ✅
waitTime(1000)
.then(() => {
console.log("第一步");
return waitTime(1000); // 返回新 Promise,继续链式
})
.then(() => {
console.log("第二步");
return waitTime(1000);
})
.then(() => {
console.log("第三步");
});
4. 进阶:async/await(Promise 语法糖)
ES7 推出的 async/await 是 Promise 的最简写法,让异步代码完全像同步代码:
javascript
// 用 async 标记函数是异步函数
async function doTask() {
try {
// await 等待 Promise 完成,直接拿到结果
const res1 = await waitTime(1000);
console.log(res1);
const res2 = await waitTime(1000);
console.log(res2);
} catch (error) {
// 统一捕获所有错误
console.error(error);
}
}
doTask();
await必须写在async函数里await后面跟 Promise 对象,会暂停等待 Promise 完成- 用
try/catch捕获错误,替代.catch()
5. 常用 Promise 静态方法
① Promise.all()
并行执行多个 Promise,全部成功才返回结果,一个失败就整体失败(常用于批量请求接口)
javascript
const p1 = waitTime(1000);
const p2 = waitTime(2000);
// 等待所有 Promise 完成
Promise.all([p1, p2]).then((results) => {
console.log(results); // [结果1, 结果2]
}).catch((err) => {
console.log("有一个失败了");
});
② Promise.race()
谁先完成(成功/失败)就返回谁的结果(常用于接口超时控制)
③ Promise.resolve() / Promise.reject()
快速创建一个成功/失败的 Promise。
总结
- Promise 是异步编程解决方案,解决回调地狱,让代码更优雅
- 三种状态:
pending→fulfilled/rejected(状态不可逆) - 核心方法:
.then()成功、.catch()失败、.finally()最终 - 最简写法:
async/await(Promise 语法糖) - 常用工具:
Promise.all()并行执行多个异步任务