Web/JavaScript/Reference/Global objects/Promise/any
Promise.any() takes an iterable of Promise objects and, as soon as one of the promises in the iterable fulfills, returns a single promise that resolves with the value from that promise. If no promises in the iterable fulfill (if all of the given promises are rejected), then the returned promise is rejected with an AggregateError, a new subclass of Error that groups together individual errors. Essentially, this method is the opposite of Promise.all().
Syntax
Promise.any(iterable);
Parameters
Return value
- An already rejected
Promiseif theiterablepassed is empty. - An asynchronously resolved
Promiseif theiterablepassed contains no promises. - A pending
Promisein all other cases. This returned promise is then resolved/rejected asynchronously (as soon as the stack is empty) when any of the promises in the giveniterableresolve, or if all the promises have rejected.
Description
This method is useful for returning the first promise that fulfills. It short-circuits after a promise fulfills, so it does not wait for the other promises to complete once it finds one. Unlike Promise.all(), which returns an array of fulfillment values, we only get one fulfillment value (assuming at least one promise fulfills). This can be beneficial if we need only one promise to fulfill but we do not care which one does. Note another difference: This method rejects upon receiving an empty iterable, since, truthfully, the iterable contains no items that fulfill.
Also, unlike Promise.race(), which returns the first settled value (either fulfillment or rejection), this method returns the first fulfilled value. This method will ignore all rejected promises up until the first promise that fulfils.
Fulfillment
The returned promise is fulfilled with the first resolved value (or non-promise value) in the iterable passed as the argument, whether or not the other promises have rejected.
- If a nonempty iterable is passed, and any of the promises fulfill, or are not promises, then the promise returned by this method is fulfilled asynchronously.
Rejection
If all of the passed-in promises reject, Promise.any asynchronously rejects with an AggregateError object, which extends Error, and contains an errors property with an array of rejection values.
- If an empty
iterableis passed, then the promise returned by this method is rejected synchronously. The rejected reason is anAggregateErrorobject whoseerrorsproperty is an empty array.
Examples
First to fulfil
Promise.any() resolves with the first promise to fulfil, even if a promise rejects first. This is in contrast to Promise.race(), which resolves or rejects with the first promise to settle.
const pErr = new Promise((resolve, reject) => {
reject("Always fails");
});
const pSlow = new Promise((resolve, reject) => {
setTimeout(resolve, 500, "Done eventually");
});
const pFast = new Promise((resolve, reject) => {
setTimeout(resolve, 100, "Done quick");
});
Promise.any([pErr, pSlow, pFast]).then((value) => {
console.log(value);
// pFast fulfils first
})
// expected output: "Done quick"
Rejections with AggregateError
Promise.any() rejects with an AggregateError if no promise fulfils.
const pErr = new Promise((resolve, reject) => {
reject('Always fails');
});
Promise.any([pErr]).catch((err) => {
console.log(err);
})
// expected output: "AggregateError: No Promise in Promise.any was resolved"
Displaying the first image loaded
In this example, we have a function that fetches an image and returns a blob. We use Promise.any() to fetch a couple of images and display the first one available (i.e. whose promise has resolved).
function fetchAndDecode(url) {
return fetch(url).then(response => {
if(!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
} else {
return response.blob();
}
})
}
let coffee = fetchAndDecode('coffee.jpg');
let tea = fetchAndDecode('tea.jpg');
Promise.any([coffee, tea]).then(value => {
let objectURL = URL.createObjectURL(value);
let image = document.createElement('img');
image.src = objectURL;
document.body.appendChild(image);
})
.catch(e => {
console.log(e.message);
});
Specifications
| Specification |
|---|
| Promise.any |
Browser compatibility
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
Update compatibility data on GitHub
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
any
|
Chrome
Full support 85 |
Edge
No support No |
Firefox
Full support 79 |
IE
No support No |
Opera
No support No |
Safari
Full support 14 |
WebView Android
Full support 85 |
Chrome Android
Full support 85 |
Firefox Android
Full support 79 |
Opera Android
No support No |
Safari iOS
Full support 14 |
Samsung Internet Android
No support No |
nodejs
Full support 15.0.0 |
Legend
- Full support
- Full support
- No support
- No support
See also
Promise.any() by Mozilla Contributors is licensed under CC-BY-SA 2.5.