Đây là những cách ngày càng dễ chịu hơn để biểu diễn công việc non-blocking trên một thread duy nhất, tất cả đều được điều khiển bên dưới bởi một event loop chạy lần lượt từng callback đã sẵn sàng. Chúng quản lý khi nào code chạy tiếp, không phải nhiều thread.
Event loop
Một vòng lặp đơn thread duy trì hàng đợi các callback đã sẵn sàng. Khi một thao tác async (timer, I/O) hoàn tất, callback của nó được đưa vào queue; loop lấy callback kế tiếp và chạy tới khi xong, rồi lặp lại. Không gì preempt một callback đang chạy, nên việc CPU dài sẽ block tất cả.
[event loop] → chạy callback → I/O xong → enqueue callback → chạy tiếp → ...
