# Promise与async/await的关系
## 1. 核心关系
Promise是async/await的底层实现基础,async/await是Promise的语法糖。它们共同构成了JavaScript异步编程的解决方案。
## 2. 技术演进
### 2.1 Promise的诞生
Promise解决了回调地狱的问题,提供了`.then()`链式调用的方式。
```javascript
function fetchData() {
return new Promise((resolve) => {
setTimeout(() => resolve('data'), 1000)
})
}
fetchData()
.then(data => console.log(data))
.catch(err => console.error(err))
2.2 async/await的出现
async/await让异步代码可以像同步代码一样书写:
async function getData() {
try {
const data = await fetchData()
console.log(data)
} catch(err) {
console.error(err)
}
}
3. 转换关系
3.1 async函数返回值
async函数总是返回一个Promise:
async function foo() {
return 1
}
// 等价于
function foo() {
return Promise.resolve(1)
}
3.2 await的实质
await会暂停async函数的执行,等待Promise解决:
const result = await somePromise
// 等价于
somePromise.then(result => {
// 后续代码
})
4. 错误处理对比
4.1 Promise方式
fetchData()
.then(data => process(data))
.catch(err => handleError(err))
4.2 async/await方式
try {
const data = await fetchData()
process(data)
} catch(err) {
handleError(err)
}
5. 最佳实践
- 优先使用async/await编写异步代码
- 在需要并行执行时结合Promise.all使用
- 避免在循环中误用await
- 始终处理Promise拒绝情况
6. 性能考量
async/await不会带来额外性能开销,因为:
- 底层仍然是Promise机制
- 现代JavaScript引擎都做了优化
- 代码可读性的提升远大于微小性能差异
7. 实际应用示例
async function getUserPosts(userId) {
try {
const user = await fetchUser(userId)
const posts = await fetchPosts(user.postIds)
return { user, posts }
} catch(error) {
console.error('Failed:', error)
throw error
}
}
8. 总结
Promise和async/await的关系可以概括为:
- Promise是基础,async/await是上层抽象
- async/await让Promise的使用更直观
- 两者可以混合使用
- 最终目的都是让异步代码更易编写和维护