A promise is pending, then either fulfilled or rejected — once, permanently. `then` chains, `catch` handles rejection and `finally` always runs.
Promise.all([a, b]); // rejects on the first failure Promise.allSettled([a, b]); // never rejects; reports each outcome Promise.race([a, timeout]); // first to settle wins
`Promise.all` is the right tool for parallel RPC reads; `race` with a timer gives you a timeout.