Callback: truyền hàm để gọi khi xong. Lồng nhiều callback bất đồng bộ → "callback hell": khó đọc, khó xử lý lỗi, đảo ngược quyền kiểm soát (inversion of control).
Promise: object đại diện cho kết quả tương lai, có 3 trạng thái pending → fulfilled | rejected. Ưu điểm:
- Chain phẳng bằng .then, gộp lỗi bằng một .catch.
- Tổ hợp: Promise.all (chờ tất cả), allSettled, race, any.
async/await: cú pháp trên Promise, viết code bất đồng bộ trông như đồng bộ:
- await tạm dừng hàm async tới khi Promise settle.
- Bắt lỗi bằng try/catch quen thuộc.
- Cẩn thận: các await tuần tự chạy nối tiếp — muốn song song thì await Promise.all([...]).
Hàm async luôn trả về Promise.