Đặc tả quy định async function luôn bọc giá trị trả về vào một Promise. return 1 cho ra Promise đã fulfilled với giá trị 1; throw err cho ra Promise đã rejected chứ không ném đồng bộ.
async function load() {
return 1
}
console.log(load()) // Promise { 1 } — không phải 1
console.log(await load()) // 1Nếu bên trong return một Promise, kết quả không bị lồng hai lớp — Promise được "làm phẳng" (adopt), nên await load() vẫn ra giá trị cuối.
Gọi mà không await (fire-and-forget):
- Hàm vẫn chạy, code sau vẫn tiếp tục ngay lập tức.
- Nếu hàm ném lỗi, không ai bắt → thành unhandled rejection. Ở Node.js mặc định làm crash process.
- Không cách nào biết khi nào nó xong → hay gây test flaky, hoặc component đã unmount mà callback vẫn setState.
Muốn cố tình fire-and-forget thì phải gắn .catch() để nuốt lỗi có chủ đích:
void trackEvent(payload).catch((err) => console.error(err))