ये एक ही thread पर non-blocking कार्य को व्यक्त करने के उत्तरोत्तर बेहतर तरीके हैं, सभी नीचे एक event loop द्वारा संचालित जो एक बार में एक तैयार callback चलाता है। वे प्रबंधित करते हैं कि code कब फिर से शुरू होता है, कई threads नहीं।
event loop
एक single-threaded loop तैयार 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 → ...
