Promise fulfills. The reaction switches the label from Loading to Calculating. A long synchronous calculation runs. The label becomes Done. The easy reading is that the user watched all three labels go by in that order, and I doubt the middle one ever showed up.
The assignments have an order. What gets painted is another story. Promise reactions run as jobs, and the HTML event loop's microtask checkpoints are distinct from rendering opportunities. Setting the label inside that reaction gives no guarantee that Calculating is on screen before the calculation starts. Useful progress means restructuring the work so rendering gets a chance, and fulfillment can't double as a paint acknowledgment.
Second scene, same handler. Request A is in flight. The user cancels A and starts B. A's completion lands after B is current. The screen should keep B's status, and A must not get to write Done over it. If the user cancels and nothing replaces A, the screen should end on a state you can recognize.
So this handler needs two things before anyone explains it. A chance to render, and a rule for which results get accepted.