A loading state is often treated as a small piece of decoration added after the real interface is finished. People experience it as part of the interface itself. They use it to decide whether to wait, retry, leave, or trust the result.
Start with the question a person is asking. If a save is in progress, say that the work is being saved and keep the draft visible. If a search takes time, preserve the query and explain what is being searched. A spinner can show motion, but it cannot answer either question.
The most useful pause is honest about uncertainty. Show progress only when the system can measure it. If the duration is unknown, use a steady status message and keep the surrounding controls predictable. Do not promise that a task is almost done when the system cannot know that.
A waiting state earns trust when it names the work and protects the user's next move.