Bird
Raised Fist0
Node.jsframework~10 mins

Promise.race and Promise.allSettled in Node.js - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Promise.race and Promise.allSettled
Start multiple promises
First promise settles
Resolve or reject with first settled promise
Wait for all promises to settle
Return array of all settled results
Promise.race returns the result of the first promise that settles (resolve or reject). Promise.allSettled waits for all promises to finish and returns their results regardless of success or failure.
Execution Sample
Node.js
const p1 = new Promise(r => setTimeout(() => r('A'), 300));
const p2 = new Promise((_, rej) => setTimeout(() => rej('B'), 200));

Promise.race([p1, p2]).then(console.log).catch(console.error);

Promise.allSettled([p1, p2]).then(console.log);
Runs two promises: one resolves after 300ms, one rejects after 200ms. Shows how Promise.race returns first settled, Promise.allSettled waits for both.
Execution Table
StepPromiseActionTime (ms)ResultPromise.race OutcomePromise.allSettled Outcome
1p1Started0PendingPendingPending
2p2Started0PendingPendingPending
3p2Rejects200Rejected with 'B'Rejected with 'B'Pending
4p1Resolves300Resolved with 'A'Rejected with 'B'Pending
5All settledAll promises settled300p1: fulfilled 'A', p2: rejected 'B'Rejected with 'B'[{status:'fulfilled', value:'A'}, {status:'rejected', reason:'B'}]
💡 Promise.race settles at 200ms with p2 rejection; Promise.allSettled waits until 300ms when both promises have settled.
Variable Tracker
VariableStartAfter 1After 2After 3Final
p1PendingPendingPendingPendingResolved 'A'
p2PendingPendingRejected 'B'Rejected 'B'Rejected 'B'
Promise.race OutcomePendingPendingRejected 'B'Rejected 'B'Rejected 'B'
Promise.allSettled OutcomePendingPendingPendingPending[{status:'fulfilled', value:'A'}, {status:'rejected', reason:'B'}]
Key Moments - 3 Insights
Why does Promise.race settle with the rejected promise even though another promise resolves later?
Because Promise.race settles as soon as the first promise settles, whether it resolves or rejects. See execution_table row 3 where p2 rejects first, so race settles immediately.
Why does Promise.allSettled wait for both promises even if one rejects early?
Promise.allSettled waits for all promises to settle regardless of resolve or reject. It collects all results. See execution_table rows 3 and 4 where it waits until both p1 and p2 finish.
What is the difference in the output format between Promise.race and Promise.allSettled?
Promise.race returns the value or reason of the first settled promise directly. Promise.allSettled returns an array of objects describing each promise's status and value or reason. See execution_table row 5.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 3: what is the Promise.race outcome?
ARejected with 'B'
BResolved with 'A'
CPending
DResolved with 'B'
💡 Hint
Check the 'Promise.race Outcome' column at step 3 in the execution_table.
At which step does Promise.allSettled return its final array of results?
AStep 3
BStep 5
CStep 4
DStep 2
💡 Hint
Look at the 'Promise.allSettled Outcome' column and find when it shows the full array.
If p2 resolved instead of rejected at 200ms, what would Promise.race return at step 3?
ARejected with 'B'
BResolved with 'A'
CResolved with p2's value
DPending
💡 Hint
Promise.race returns the first promise that settles, so if p2 resolves first, it returns p2's value.
Concept Snapshot
Promise.race(promises): returns the first promise that settles (resolve or reject).
Promise.allSettled(promises): waits for all promises to settle, returns array of {status, value/reason}.
Use race to get fastest result; use allSettled to get all results regardless of success.
Both return promises themselves.
Race settles early; allSettled waits for all.
Full Transcript
This visual trace shows how Promise.race and Promise.allSettled behave with two promises: one resolving after 300ms and one rejecting after 200ms. Promise.race settles as soon as the first promise settles, which is the rejection at 200ms, so it returns that rejection immediately. Promise.allSettled waits for both promises to finish, then returns an array describing each promise's outcome. Variables track promise states and outcomes step-by-step. Key moments clarify why race settles early and allSettled waits for all. The quiz tests understanding of timing and results based on the execution table.

Practice

(1/5)
1. What does Promise.race do when given multiple promises?
easy
A. Cancels all promises except the first one.
B. Waits for all promises to finish and returns their results.
C. Returns only the results of promises that resolved successfully.
D. Returns the result or error of the first promise that finishes.

Solution

  1. Step 1: Understand Promise.race behavior

    Promise.race returns as soon as any promise settles (resolves or rejects).
  2. Step 2: Compare with other Promise methods

    Unlike Promise.all or allSettled, it does not wait for all promises.
  3. Final Answer:

    Returns the result or error of the first promise that finishes. -> Option D
  4. Quick Check:

    Promise.race = first finished promise result [OK]
Hint: Remember race means first to finish wins [OK]
Common Mistakes:
  • Thinking it waits for all promises
  • Assuming it only returns successful results
  • Believing it cancels other promises
2. Which of the following is the correct syntax to use Promise.allSettled with an array of promises named tasks?
easy
A. Promise.allSettled(tasks).finally(() => console.log('done'));
B. Promise.allSettled(tasks).catch(error => console.log(error));
C. Promise.allSettled(tasks).then(results => console.log(results));
D. Promise.allSettled(tasks).resolve(results => console.log(results));

Solution

  1. Step 1: Recall Promise.allSettled usage

    Promise.allSettled returns a promise that resolves with an array of results.
  2. Step 2: Check correct method chaining

    We use .then() to handle the resolved results, not .catch() or .resolve().
  3. Final Answer:

    Promise.allSettled(tasks).then(results => console.log(results)); -> Option C
  4. Quick Check:

    Use .then() to get allSettled results [OK]
Hint: Use .then() to handle Promise.allSettled results [OK]
Common Mistakes:
  • Using .catch() instead of .then() for results
  • Trying to use .resolve() method on promise
  • Assuming .finally() receives results
3. Consider the code:
const p1 = new Promise(res => setTimeout(() => res('A'), 100));
const p2 = new Promise((_, rej) => setTimeout(() => rej('Error'), 50));
Promise.race([p1, p2])
  .then(console.log)
  .catch(console.error);

What will be printed?
medium
A. 'Error'
B. 'A'
C. An array of results
D. Nothing, code throws syntax error

Solution

  1. Step 1: Identify which promise settles first

    p2 rejects after 50ms, p1 resolves after 100ms, so p2 finishes first.
  2. Step 2: Understand Promise.race behavior on rejection

    Promise.race rejects immediately with the first rejection, so .catch logs 'Error'.
  3. Final Answer:

    'Error' -> Option A
  4. Quick Check:

    First finished promise is rejection 'Error' [OK]
Hint: Check which promise settles first, resolve or reject [OK]
Common Mistakes:
  • Assuming resolve wins over reject
  • Expecting an array instead of single result
  • Thinking code throws syntax error
4. What is wrong with this code snippet?
const promises = [Promise.resolve(1), Promise.reject('fail')];
Promise.allSettled(promises).catch(console.error);
medium
A. Promise.allSettled requires async/await syntax.
B. Promise.allSettled never rejects, so .catch will never run.
C. Promises array must contain only resolved promises.
D. You must use .then() before .catch() with allSettled.

Solution

  1. Step 1: Recall Promise.allSettled behavior

    It waits for all promises and never rejects, it always resolves with results.
  2. Step 2: Understand .catch usage here

    Since it never rejects, .catch will never be called, so error handling is ineffective.
  3. Final Answer:

    Promise.allSettled never rejects, so .catch will never run. -> Option B
  4. Quick Check:

    allSettled always resolves, .catch unused [OK]
Hint: allSettled never rejects, so .catch is useless here [OK]
Common Mistakes:
  • Thinking allSettled rejects on any promise failure
  • Believing async/await is required
  • Assuming .then() must come before .catch() always
5. You want to run three tasks: task1, task2, and task3. You want to get the first task that finishes successfully, but if all fail, you want to know all errors. Which approach correctly achieves this?
hard
A. Use Promise.race on all tasks, then if it rejects, run Promise.allSettled to get all errors.
B. Use Promise.allSettled first, then pick the first successful result from the array.
C. Use Promise.all on all tasks and catch errors to get all results.
D. Use Promise.race and ignore errors from rejected promises.

Solution

  1. Step 1: Understand requirement for first success or all errors

    Promise.race gives first finished promise, but may reject if first is failure.
  2. Step 2: Combine Promise.race and Promise.allSettled

    If Promise.race rejects, then run Promise.allSettled to collect all errors from all tasks.
  3. Step 3: Evaluate other options

    Promise.allSettled alone waits for all, no early success; Promise.all fails fast; ignoring errors loses info.
  4. Final Answer:

    Use Promise.race on all tasks, then if it rejects, run Promise.allSettled to get all errors. -> Option A
  5. Quick Check:

    race first success, allSettled for all errors [OK]
Hint: Race first success, fallback to allSettled for errors [OK]
Common Mistakes:
  • Using allSettled only and waiting too long
  • Ignoring rejected promises in race
  • Using all which fails on first rejection