async/await 与异步错误处理
async/await 与异步错误处理
async/await 是 Promise 的语法糖,让异步代码看起来像同步的,是目前处理异步的首选。
基本规则
async function getPost(id) {
const res = await fetch('/api/posts/' + id) // 等待 Promise 落定
const post = await res.json()
return post // async 函数永远返回 Promise,return 的值会被包装
}
getPost(1).then(post => console.log(post))
await 只能出现在 async 函数里(或顶层 ESM 模块中)。它"暂停"的只是当前函数,线程不阻塞,事件循环照常运转。
错误处理
await 等到 rejected 的 Promise 会抛出异常,用 try/catch 接:
async function load() {
try {
const post = await fetchPost(1)
render(post)
} catch (err) {
showError(err.message) // 网络错误、404、业务异常统一在这处理
}
}
不 catch 会导致 unhandledRejection,Node 下甚至可能让进程崩溃。
常见误区
串行 await 拖慢速度:无依赖关系的请求被写成排队执行:
// 慢:两个请求串行
const user = await fetchUser()
const posts = await fetchPosts()
// 快:先一起发,再一起等
const [user, posts] = await Promise.all([fetchUser(), fetchPosts()])
循环里注意:forEach 不支持 await(回调并发执行、等不到),要按顺序就用 for...of,要并发就 Promise.all(arr.map(fn))。
经验:底层 API 可以继续返回 Promise(更灵活),业务编排层用 async/await(更清晰),两者自由搭配。
看到这里了?如果这篇文章帮到过你
请我喝瓶可乐就好 🥤

评论0 条
还没有评论,来抢沙发~