Nếu coi lập trình là cách con người mô phỏng thế giới, thì async/await và Promise trong JavaScript giống như một thứ văn chương đặc biệt — nơi hiện tại luôn bị kéo căng bởi tương lai, và mọi hành động đều mang trong mình một lời hứa chưa hoàn thành.
Trong lập trình đồng bộ, mọi thứ diễn ra như một câu chuyện tuyến tính: mở đầu, cao trào, kết thúc. Nhưng khi bước vào thế giới của Promise, ta không còn kể chuyện theo dòng thẳng nữa. Thay vào đó, mỗi hành động trở thành một “lời hứa” (promise) — rằng một điều gì đó sẽ xảy ra, nhưng không phải ngay lúc này.
Một Promise có ba trạng thái: chờ đợi (pending), hoàn thành (fulfilled), hoặc thất bại (rejected). Nghe rất giống đời sống: con người cũng luôn sống trong trạng thái “đang chờ” một điều gì đó — một kết quả, một cơ hội, hay một hồi đáp. Khi lời hứa được thực hiện, ta tiến lên; khi nó thất bại, ta buộc phải xử lý nỗi thất vọng đó (catch).