Это последовательно всё более удобные способы выразить неблокирующую работу на одном потоке, все они снизу приводятся в движение event loop, который выполняет готовые колбэки по одному за раз. Они управляют тем, когда код возобновляется, а не несколькими потоками.
Event loop
Однопоточный цикл поддерживает очередь готовых колбэков. Когда асинхронная операция (таймер, I/O) завершается, её колбэк ставится в очередь; цикл берёт следующий и выполняет его до завершения, затем повторяет. Ничто не вытесняет выполняющийся колбэк, поэтому долгая CPU-работа блокирует всё.
[event loop] → выполнить колбэк → I/O завершается → поставить колбэк в очередь → выполнить следующий → ...
