یہ ایک ہی thread پر non-blocking کام کو ظاہر کرنے کے تدریجی طور پر بہتر طریقے ہیں، جو سب اندر ہی اندر ایک event loop سے چلتے ہیں جو ready callbacks کو ایک ایک کر کے چلاتا ہے۔ یہ سنبھالتے ہیں کہ کوڈ کب resume ہوتا ہے، نہ کہ کئی threads۔
event loop
ایک single-threaded loop ready callbacks کی ایک queue رکھتا ہے۔ جب کوئی async operation (timer، I/O) مکمل ہوتا ہے، تو اس کا callback enqueue ہو جاتا ہے؛ loop اگلا اٹھاتا ہے اور اسے مکمل ہونے تک چلاتا ہے، پھر دہراتا ہے۔ کوئی چیز چلتے callback کو preempt نہیں کرتی، اس لیے طویل CPU کام سب کچھ block کر دیتا ہے۔
[event loop] → run callback → I/O finishes → enqueue callback → run next → ...
