Node.js is backwards
On the other hand, Node.js is a hack on top of Javascript/V8 to replicate these features. It requires explicit continuation-passing-style (chains of callbacks) since the language itself doesn’t support event-driven I/O. The code blocks until you return from the current function and pass a callback (continuation) to the global event loop. When your blocking I/O is complete and the event-loop is surrendered to, it will call the callback you provided, continuing the execution of your “task.” The result is isomorphic to user-space threads where the scheduling is done by the programmed code rather than a backing runtime scheduler. The lack of language support also necessitates that the programmer manually run one process per core and figure out a way to make “Nodes” communicate.
more on blog.ankurgoyal.com
How parallel programming with node.js is different from Erlang.