JS await 基础入门类
· 4 min read
JS 中 async/await 不是新功能,是 Promise 的语法糖——本质还是回调。
掌握 await 只需记住 三 件事:
- await 只能用在 async 函数里,async 函数永远返回 Promise
- await 会"暂停"当前函数,但不会阻塞主线程,其他代码照常跑
- 抛错用 try/catch,忘记 try/catch 会导致 UnhandledPromiseRejection
最佳实践:并发请求用 Promise.all,别串行 await,慢到怀疑人生。
一句话讲清 await 是什么
await 就是"等这个 Promise 出结果,再往下走"。
写回调时代我们这么写:
fetchUser(id, (user) => {
fetchOrders(user.id, (orders) => {
render(orders);
});
});
Promise 时代变成链式:
fetchUser(id)
.then((user) => fetchOrders(user.id))
.then((orders) => render(orders));
async/await 时代,写起来像同步代码:
async function load(id) {
const user = await fetchUser(id);
const orders = await fetchOrders(user.id);
render(orders);
}
代码长得像同步,但执行起来还是异步的——这是 await 最容易让人误解的地方。
async 函数的真面目
任何 async 函数都返回 Promise,不管你写没写 return。
async function foo() {
return 1;
}
foo(); // Promise { 1 }
foo().then(console.log); // 1
就算函数里 throw new Error('boom'),外面拿到的也是一个 rejected 的 Promise,不是同步抛出的异常。这意味着你不能用普通 try/catch 包住 foo() 调用本身,得包住 await foo()。