เหล่านี้คือวิธีที่ค่อย ๆ ดีขึ้นในการแสดงงานแบบ non-blocking บน thread เดียว โดยทั้งหมดถูกขับเคลื่อนเบื้องล่างด้วย event loop ที่รัน callback ที่พร้อมทำงานทีละตัว พวกมันจัดการ ว่าเมื่อไร โค้ดจะทำงานต่อ ไม่ใช่การจัดการหลาย thread
Event loop
ลูปแบบ single-thread ดูแล queue ของ callback ที่พร้อมทำงาน เมื่อ async operation (timer, I/O) เสร็จสิ้น callback ของมันจะถูกใส่เข้า queue; ลูปหยิบตัวถัดไปมารันจนจบ แล้วทำซ้ำ ไม่มีอะไร preempt callback ที่กำลังรันอยู่ ดังนั้นงาน CPU ที่ยาวจะบล็อกทุกอย่าง
[event loop] → run callback → I/O finishes → enqueue callback → run next → ...
