Dit zijn steeds prettigere manieren om non-blocking werk op één thread uit te drukken, allemaal onderliggend aangedreven door een event loop die klaarstaande callbacks één voor één uitvoert. Ze beheren wanneer code hervat, niet meerdere threads.
De event loop
Een single-threaded lus onderhoudt een queue van klaarstaande callbacks. Wanneer een async-operatie (timer, I/O) voltooit, wordt zijn callback in de queue gezet; de lus pakt de volgende en voert hem tot voltooiing uit, en herhaalt dan. Niets preempteert een lopende callback, dus lang CPU-werk blokkeert alles.
[event loop] → run callback → I/O finishes → enqueue callback → run next → ...
