Asher Cohen
Back to posts

JavaScript Promise.allSettled() Method

Handle multiple promises that may fail without stopping execution

Introduction

Promise.allSettled() waits for all promises to complete—whether they succeed or fail—and gives you the results of each one.

Introduced in ES2020, supported in all modern browsers and Node.js v12.9.0+.

Syntax

Promise.allSettled(iterable)

Returns: Array of objects with status ('fulfilled' or 'rejected'), and either value or reason.

Basic Usage

const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => 
  setTimeout(reject, 100, 'foo')
);

const results = await Promise.allSettled([promise1, promise2]);

console.log(results);
// [
//   { status: 'fulfilled', value: 3 },
//   { status: 'rejected', reason: 'foo' }
// ]

Real-World Examples

Fetching Independent Resources

async function fetchDashboardData() {
  const results = await Promise.allSettled([
    fetchAnalytics(),
    fetchNotifications(),
    fetchUserSettings()
  ]);
  
  return {
    analytics: results[0].status === 'fulfilled' ? results[0].value : null,
    notifications: results[1].status === 'fulfilled' ? results[1].value : null,
    settings: results[2].status === 'fulfilled' ? results[2].value : null
  };
}

Batch Operations

async function uploadFiles(files) {
  const results = await Promise.allSettled(
    files.map(file => uploadFile(file))
  );
  
  const successful = results
    .filter(r => r.status === 'fulfilled')
    .map(r => r.value);
    
  const failed = results
    .filter(r => r.status === 'rejected')
    .map(r => r.reason);
  
  return { successful, failed };
}

Promise.allSettled() vs Promise.all()

Promise.all() - Fail Fast

try {
  const results = await Promise.all([task1(), task2()]);
  // All succeed or none execute
} catch (error) {
  // Stops at first failure
}

Use when: All operations must succeed.

Promise.allSettled() - Complete All

const results = await Promise.allSettled([task1(), task2()]);
// All complete, regardless of failures

Use when: You want all results, even partial successes.

Handling Results

const results = await Promise.allSettled(promises);

// Filter by status
const successful = results
  .filter(r => r.status === 'fulfilled')
  .map(r => r.value);

const failed = results
  .filter(r => r.status === 'rejected')
  .map(r => r.reason);

// Default values
const user = results[0].status === 'fulfilled' 
  ? results[0].value 
  : defaultUser;

When to Use

Good fits:

  • Fetching independent data sources
  • Batch operations with acceptable failures
  • Progress tracking

Avoid when:

  • Operations must all succeed (use Promise.all())
  • Dependent operations (use chaining)

Best Practices

Log Failures

results.forEach((result, index) => {
  if (result.status === 'rejected') {
    console.error(`Task ${index} failed:`, result.reason);
  }
});

Provide Context

const results = await Promise.allSettled(
  users.map(user => ({
    userId: user.id,
    promise: updateUser(user)
  }))
);

Conclusion

Promise.allSettled() is your tool for resilient async code. Use it when you need all results, regardless of failures.

#javascript #async #promises #es2020