async/await là syntactic sugar trên Promise — async function luôn trả về Promise, còn await tạm dừng thực thi của chính function đó (không block thread) cho đến khi Promise settle.
Try/catch bắt rejected Promise như exception thường:
js
try {
const data = await fetch(url).then(r => r.json())
} catch (e) {
// lỗi mạng, lỗi parse JSON
}Chạy song song hay tuần tự quyết định tổng thời gian:
js
// tuần tự — tổng = a + b
await a()
await b()
// song song — tổng = max(a, b)
const [ra, rb] = await Promise.all([a(), b()])
// await trong vòng lặp cũng là tuần tự, rất chậm
for (const id of ids) { await fetchUser(id) }
// sửa:
await Promise.all(ids.map(id => fetchUser(id)))- Gọi
foo()mà không await/catch một async function có throw = unhandled rejection. - ESM module hỗ trợ top-level
await(ngoài function) — tiện cho dynamic import, khởi tạo DB. - Khi debug: stack trace của async/await rõ hơn hẳn Promise chain.