Start from the contract, not the syntax
Before you write the code, decide what should happen when one task fails or arrives first.
Real products often launch several requests together: profile, permissions, notifications, charts, metrics or search suggestions.
The key question is not only how to run them, but how much of the interface should depend on all of them succeeding.
Promise.all
Everything must succeed or the whole flow fails.
Promise.allSettled
You always get every result and can degrade partially.
Promise.race
The first settled promise wins, whether it succeeds or fails.
Promise.any
The first successful promise wins, and rejections are ignored until all fail.