but on the client, on the contrary, if the situation with promises, each call chain function waiting for each other, i.e. serially.
This is not true. The chain is not waiting for each other - the thread is not blocked, as well as the node. When it comes to the response server calls appropriate callback. But while waiting - your code works (for instance you wanted to render the loading animation).
In the asynchronous action you can change state (to dispatchit) when you wish. This is usually done twice - when the request is sent (initiated) and when the answer came. Between these moments you may have other action (user pressed a button or something else happened) and you also handle them asynchronously.