Promise 简要介绍
📋 一句话概括
Promise 是 JavaScript 中处理异步操作的对象,表示一个将来会完成(或失败)的操作。
🎯 三种状态
- pending(进行中)⏳
- fulfilled(已成功)✅
- rejected(已失败)❌
📝 基本语法
// 创建 Promise
const promise = new Promise((resolve, reject) => {
// 异步操作...
if (成功) {
resolve('成功的结果')
} else {
reject('失败的原因')
}
})
// 使用 Promise
promise
.then(result => console.log('成功:', result))
.catch(error => console.error('失败:', error))
.finally(() => console.log('无论成功失败都执行'))
💡 经典示例
1. 模拟异步请求
function fetchData(url) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (url === '/api/data') {
resolve({ data: '获取的数据' })
} else {
reject(new Error('404 Not Found'))
}
}, 1000)
})
}
// 使用
fetchData('/api/data')
.then(response => console.log(response.data))
.catch(error => console.error(error.message))
2. 链式调用(告别回调地狱)
// 传统回调地狱
getUser(id, user => {
getOrders(user.id, orders => {
getDetails(orders[0].id, details => {
console.log(details)
})
})
})
// Promise 链式调用
getUser(id)
.then(user => getOrders(user.id))
.then(orders => getDetails(orders[0].id))
.then(details => console.log(details))
.catch(error => console.error(error))
🔧 常用方法
1. Promise.all(全部成功)
// 并行执行,全部成功才成功
Promise.all([task1(), task2(), task3()])
.then(results => console.log('全部完成:', results))
.catch(error => console.error('有一个失败就失败'))
2. Promise.race(竞速)
// 哪个先完成就用哪个的结果
Promise.race([fastTask(), slowTask()])
.then(result => console.log('最快的完成了:', result))
3. Promise.any(任意一个成功)
// 任意一个成功就成功
Promise.any([api1(), api2(), api3()])
.then(result => console.log('有一个成功了:', result))
⚡ 主要特点
优点
✅ 链式调用:避免回调地狱
✅ 错误处理:统一的 catch
✅ 状态可控:三种明确状态
✅ 组合灵活:all、race、any 等
注意事项
⚠️ 不可取消:一旦开始不能取消
⚠️ 单次使用:状态改变后不可逆
⚠️ 错误穿透:不写 catch 错误会静默失败
🔄 实际应用
API 请求封装
function request(url, options = {}) {
return new Promise((resolve, reject) => {
fetch(url, options)
.then(response => {
if (response.ok) {
return response.json()
} else {
reject(new Error(`HTTP ${response.status}`))
}
})
.then(data => resolve(data))
.catch(error => reject(error))
})
}
// 使用
request('/api/users')
.then(users => console.log(users))
.catch(error => console.error('请求失败:', error))
📈 与 async/await 关系
// Promise
function getData() {
return fetch('/api')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error))
}
// async/await(Promise 的语法糖)
async function getData() {
try {
const response = await fetch('/api')
const data = await response.json()
console.log(data)
} catch (error) {
console.error(error)
}
}
🎓 记住这几点
- 三种状态:pending、fulfilled、rejected
- 链式调用:.then().catch().finally()
- 错误处理:一定要写 catch
- 组合使用:all、race、any 等
- async/await 基础:async/await 基于 Promise
📋 总结
Promise 是 JavaScript 异步编程的基础,让异步代码更清晰、更易维护,是现代前端开发的必备技能。
