controlling the timing of operations by the use of pulses sent when the previous operation is completed rather than at regular intervals.
Asynchronous programming, as we know now in JavaScript, can only be achieved with functions being first-class citizens of the language:
they can be passed around like any other variable to other functions.
Up until recently (ES6), JS itself has actually never had any direct notion of asynchrony built into it;
Callbacks are the fundamental unit of asynchrony in JS.
Callbacks are the fundamental unit of asynchrony in JS. But they’re not enough for the evolving landscape of async programming as JS matures.