Docs
16.1-Promise-Combinators
18.1 Promise Combinators
Overview
Promise combinators are static methods on the Promise constructor that work with multiple promises. They enable parallel execution and provide different strategies for handling multiple async operations.
Promise.all()
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Promise.all() ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā ā
ā Promise.all([promise1, promise2, promise3]) ā
ā ā
ā āāāāāāāāāāā āāāāāāāāāāā āāāāāāāāāāā ā
ā ā Fetch A ā ā Fetch B ā ā Fetch C ā ā Parallel execution ā
ā āāāāāā¬āāāāā āāāāāā¬āāāāā āāāāāā¬āāāāā ā
ā ā ā ā ā
ā ā¼ ā¼ ā¼ ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā ā Wait for ALL ā ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā ā ā
ā ā¼ ā
ā [resultA, resultB, resultC] ā Order preserved! ā
ā ā
ā ā ļø If ANY promise rejects, the whole Promise.all rejects ā
ā ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Behavior
| Scenario | Result |
|---|---|
| All fulfill | Resolves with array of values (order preserved) |
| Any rejects | Rejects with first rejection reason |
| Empty array | Resolves immediately with [] |
Use Cases
- ā¢Fetching multiple resources simultaneously
- ā¢Waiting for multiple independent operations
- ā¢Initializing multiple services
Promise.allSettled()
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Promise.allSettled() ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā ā
ā Promise.allSettled([promise1, promise2, promise3]) ā
ā ā
ā Always resolves with array of outcome objects: ā
ā ā
ā [ ā
ā { status: 'fulfilled', value: result1 }, ā
ā { status: 'rejected', reason: error }, ā
ā { status: 'fulfilled', value: result3 } ā
ā ] ā
ā ā
ā ā
Never rejects (unless passed non-iterable) ā
ā ā
Reports all outcomes, successful or not ā
ā ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Use Cases
- ā¢When you need results from all operations regardless of failures
- ā¢Logging/analytics for multiple operations
- ā¢Graceful handling of partial failures
Promise.race()
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Promise.race() ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā ā
ā Promise.race([promise1, promise2, promise3]) ā
ā ā
ā āāāāāāāāāāā āāāāāāāāāāā āāāāāāāāāāā ā
ā ā 100ms ā ā 50ms ā ā 200ms ā ā
ā āāāāāā¬āāāāā āāāāāā¬āāāāā āāāāāā¬āāāāā ā
ā ā ā ā ā
ā ā ā¼ ā ā
ā ā š WINNER! ā ā First to settle ā
ā ā ā ā
ā ā
ā Result: Whatever promise2 resolves/rejects with ā
ā ā
ā ā ļø Other promises keep running (just ignored) ā
ā ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Use Cases
- ā¢Implementing timeouts
- ā¢Getting fastest response from multiple sources
- ā¢First-come-first-served patterns
Promise.any()
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Promise.any() ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā ā
ā Promise.any([promise1, promise2, promise3]) ā
ā ā
ā āāāāāāāāāāā āāāāāāāāāāā āāāāāāāāāāā ā
ā ā REJECT ā ā FULFILL ā ā REJECT ā ā
ā āāāāāā¬āāāāā āāāāāā¬āāāāā āāāāāā¬āāāāā ā
ā ā ā ā ā
ā ā ā¼ ā ā
ā š WINNER! ā First to FULFILL ā
ā ā
ā Ignores rejections until one fulfills ā
ā If ALL reject ā AggregateError with all errors ā
ā ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Use Cases
- ā¢Fallback sources (CDN, backup servers)
- ā¢Any successful result is acceptable
- ā¢Resilient data fetching
Comparison Table
| Combinator | Fulfills When | Rejects When |
|---|---|---|
all | All fulfill | Any rejects |
allSettled | All settle | Never* |
race | First settles (fulfill) | First settles (reject) |
any | First fulfills | All reject |
Summary
- ā¢
Promise.all()- All must succeed, fail-fast on any error - ā¢
Promise.allSettled()- Get all results, never rejects - ā¢
Promise.race()- First to complete wins - ā¢
Promise.any()- First success wins, ignores failures