100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace

Promise.all vs Promise.allSettled: When to Use Each?

Learn the difference between Promise.all and Promise.allSettled, their result shapes, and when to use each pattern.

mediumQ133 of 224 in Web Development Est. time: 5 minsLast updated:
Open Code Lab

Expected Interview Answer

Promise.all resolves with an array of values only if every input promise fulfills, and it rejects immediately with the first rejection reason if any one fails, while Promise.allSettled always resolves once every promise has either fulfilled or rejected, returning a status-tagged result for each one so no outcome is ever lost.

Promise.all is an “all or nothing” combinator: it is ideal when the operations are dependent, meaning the overall task is meaningless unless every sub-task succeeds, such as fetching multiple required config files before starting an app. The moment any single promise in the array rejects, Promise.all short-circuits and rejects with that reason, leaving the outcomes of the still-pending promises inaccessible from that call (although they keep running in the background). Promise.allSettled never short-circuits and never rejects on its own; it waits for every promise to settle and returns an array of objects shaped like { status: "fulfilled", value } or { status: "rejected", reason }, which is the right choice when you want to attempt several independent operations and handle each outcome separately, like sending several unrelated notifications where one failing should not stop you from knowing which others succeeded. Choosing wrong shows up as either losing partial success information (using all when you needed allSettled) or treating a partial failure as total success (using allSettled but forgetting to check individual statuses).

  • Promise.all gives fast-fail behavior when every result is strictly required
  • Promise.allSettled guarantees you learn the outcome of every promise, success or failure
  • allSettled avoids unhandled rejection warnings from promises you did not explicitly catch
  • Correct choice avoids silently losing partial results in bulk operations

AI Mentor Explanation

Promise.all is like a team relay chase target that only counts as achieved if every single batting partnership contributes runs without a single one failing — one collapse and the whole chase is declared failed immediately. Promise.allSettled is like reviewing every partnership after the innings ends regardless of outcome, recording which partnerships succeeded and which collapsed, without declaring the whole innings a failure just because one partnership got out cheaply. Use the relay-style all-or-nothing approach when every partnership must succeed for the goal to matter, and the post-innings review approach when you need the full picture of every partnership’s fate. That distinction between fail-fast-on-first-loss and wait-for-every-outcome is exactly Promise.all versus Promise.allSettled.

Step-by-Step Explanation

  1. Step 1

    Identify dependency between operations

    Decide if the overall task is meaningless unless every promise succeeds (use all) or if each outcome matters independently (use allSettled).

  2. Step 2

    Promise.all short-circuits on first rejection

    It rejects immediately with the first failure reason; other promises keep running but their results are not collected by that call.

  3. Step 3

    Promise.allSettled waits for every promise

    It never rejects on its own and resolves only once all promises have fulfilled or rejected.

  4. Step 4

    Inspect the settled results array

    Each entry is { status: "fulfilled", value } or { status: "rejected", reason } — filter or map to handle successes and failures separately.

What Interviewer Expects

  • Correct explanation of fail-fast vs wait-for-all semantics
  • Knowledge of the exact result shapes each returns
  • A concrete example of when partial success matters (allSettled) vs when it does not (all)
  • Awareness that Promise.all does not cancel the still-pending promises on rejection

Common Mistakes

  • Using Promise.all when partial failures should still be reported individually
  • Forgetting to check the status field per result when using allSettled
  • Assuming Promise.all cancels in-flight promises once one rejects (it does not)
  • Not catching the rejection from Promise.all, causing an unhandled rejection

Best Answer (HR Friendly)

Promise.all is an all-or-nothing tool: if everything you are waiting on needs to succeed, use it, because it will immediately fail the moment any one thing fails. Promise.allSettled is for when you want to know the outcome of everything no matter what, so even if some things fail and some succeed, you get a full report instead of an immediate failure.

Code Example

Promise.all vs Promise.allSettled
const requiredConfigs = [
  fetch('/config/app.json'),
  fetch('/config/theme.json'),
]

// All-or-nothing: app cannot start without both configs
try {
  const [appCfg, themeCfg] = await Promise.all(requiredConfigs)
} catch (err) {
  console.error('Startup failed, a required config was missing:', err)
}

const notifications = [
  sendEmail(userA),
  sendEmail(userB),
  sendEmail(userC),
]

// Independent operations: report each outcome, no short-circuit
const results = await Promise.allSettled(notifications)
const failed = results.filter(r => r.status === 'rejected')
console.log(`${failed.length} of ${results.length} notifications failed`)

Follow-up Questions

  • How would you implement Promise.all manually using a counter and a single Promise?
  • What happens to promises still pending when Promise.all rejects?
  • How does Promise.any differ from both Promise.all and Promise.allSettled?
  • When would you combine allSettled with a retry strategy for the rejected entries?

MCQ Practice

1. What does Promise.all do the moment one input promise rejects?

Promise.all short-circuits and rejects as soon as any single promise in the array rejects.

2. Can Promise.allSettled itself reject?

Promise.allSettled always resolves; individual failures are represented inside the result array, not as an overall rejection.

3. What shape does each entry in a Promise.allSettled result array have?

Each entry is { status: "fulfilled", value } or { status: "rejected", reason }.

Flash Cards

Promise.all on first rejection?Immediately rejects with that reason; other promises keep running but their outcomes are not collected.

Promise.allSettled rejection behavior?Never rejects on its own; resolves once every promise has settled.

allSettled result entry shape?{ status: "fulfilled", value } or { status: "rejected", reason }.

When to prefer Promise.all?When every operation is required and partial success is meaningless.

1 / 4

Continue Learning