A callback works better than Promises or async/await in cases you need to subscribe to multiple values or events over time (ex: a websocket channel or DOM events).
There is a nice abstraction on top of callbacks that handle multiple events : Observables (xstream, rxjs). It provides a nice chained api to filter, transform, accumulate, delay and debounce events (and a lot more).
I you want to learn more about why Observables are just "callbacks" I recommend reading this article medium.com/@benlesh/learning-observable-by-buildi… that has been enlightening to me about the nature of this primitive.