"Sent X" or "Finished Y!" is sufficient to distinguish a failed ajax call from a successful button press
I remember some years ago when Ubuntu file sync would pop a notification every time a file was synced. That's a good example of what not to do.
UIs in games have this solved in countless of ways.
According to Google that would be around 100ms.
> Guidelines:
> Process user input events within 50ms to ensure a visible response within 100ms, otherwise the connection between action and reaction is broken. This applies to most inputs, such as clicking buttons, toggling form controls, or starting animations. This does not apply to touch drags or scrolls.
https://developers.google.com/web/fundamentals/performance/r...
I can't remember the last time I saw a spinner that actually showed some kind of variable behavior. If you have that, it's more likely you are being shown a progress bar.
A static loading message is exactly the same, while the message is on the screen the request is still pending and while it is gone it is not. The only case you are not catching is where the browser locks up and becomes unable to render the spinning which is not that common or useful.
It might not be fancy but it's simple and helps.