it depends on your case I guess.
I use sagas, but that's why we have category theory. it does no matter as long as the result of the dispatched call is a valid redux action / result.
I think it's about how you want to think and structure your code. I like my reducers pretty dumb if possible and I like generators so I picked sagas.
Others just want to do ajax calls or ajax processing so thunk or promise middleware seams a good solution.
Others might want a more reactive approach utilizing observers, the other two I don't know.
In theory you can easily build a rather simple middleware that does just the job you want in the end you just need 'match or pass action' => return action
as described in redux.js.org/advanced/middleware BTW I cannot stress enough how much I love the redux documentation Dan Abramov.