Estas são formas progressivamente mais agradáveis de expressar trabalho não bloqueante em uma única thread, todas movidas por baixo por um event loop que roda os callbacks prontos um de cada vez. Elas gerenciam quando o código retoma, não múltiplas threads.
O event loop
Um loop de thread única mantém uma fila de callbacks prontos. Quando uma operação assíncrona (timer, I/O) se completa, seu callback é enfileirado; o loop pega o próximo e o roda até o fim, depois repete. Nada preempta um callback em execução, então trabalho longo de CPU bloqueia tudo.
[event loop] → run callback → I/O finishes → enqueue callback → run next → ...
