When designing asynchronous operations in a React application (such as data fetching), it's easy to overlook the confusing and inconsistent user experience it can result in. The following issues can arise: - Managing promise states manually can be harmful to the user's experience. - Visibly reloading data that has already been seen by the user. - Loading spinners can appear for microseconds before resolving content. In an ever-present battle for our user's attention, details matter. Any combination of the above issues can lead to quite a jarring experience, so what can we do about it?