I know that this question already has several great answers, but I found an extra explanation in the context of RxJS (and for me in the bigger context of redux-observable) here: https://rxjs.dev/guide/observable#pull-versus-push
I also found this image helpful, it can be found at the top of https://rxjs.dev/guide/observable#pull-versus-push and has some useful links:
Observable Table