At some level it's always callbacks. Then people build frameworks on top of these so programmers can pretend they're not dealing with callbacks.