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