Promise.any()
静态方法 Promise.any() 接收一个可迭代对象(iterable)的 Promises 作为输入,并返回一个单独的 Promise。这个返回的 Promise 会在输入的 Promises 中任何一个 fulfilled(成功)时 fulfilled,并使用该第一个 fulfilled 的 Promise 的值。当输入的所有 Promises 都 rejected(失败)时,它会 rejected,并返回一个 AggregateError,其中包含一个 rejection reasons 数组。
试一试
const promise1 = Promise.reject(new Error("error"));
const promise2 = new Promise((resolve) => setTimeout(resolve, 100, "quick"));
const promise3 = new Promise((resolve) => setTimeout(resolve, 500, "slow"));
const promises = [promise1, promise2, promise3];
Promise.any(promises).then((value) => console.log(value));
// Expected output: "quick"
语法
Promise.any(iterable)
参数
返回值
一个 Promise,它
- 如果传入的可迭代对象为空,则已 rejected。
- 当给定可迭代对象中的任何一个 Promise fulfilled 时,异步 fulfilled。fulfilled 的值是第一个 fulfilled 的 Promise 的值。
- 当给定可迭代对象中的所有 Promise 都 rejected 时,异步 rejected。rejection 原因是其
errors属性中包含 rejection reasons 数组的AggregateError。错误按传入 Promises 的顺序排列,与完成顺序无关。如果传入的可迭代对象非空但其中不包含待处理的 Promise,则返回的 Promise 仍然是异步(而不是同步)rejected。
描述
Promise.any() 方法是 Promise 并发方法之一。此方法对于返回第一个 fulfilled 的 Promise 非常有用。它会在一个 Promise fulfilled 后短路,因此一旦找到一个 Promise fulfilled,它就不会等待其他 Promises 完成。
与返回 Promise fulfilled 值数组的 Promise.all() 不同,我们只得到一个 fulfilled 值(假设至少有一个 Promise fulfilled)。如果只需要一个 Promise fulfilled 且不关心是哪一个,这会很有好处。请注意另一个区别:此方法在接收到空的可迭代对象时 rejected,因为实际上该可迭代对象中没有 fulfilled 的项。你可以将 Promise.any() 和 Promise.all() 与 Array.prototype.some() 和 Array.prototype.every() 进行比较。
同样,与返回第一个已结算(fulfilled 或 rejected)值的 Promise.race() 不同,此方法返回第一个fulfilled的值。此方法会忽略所有 rejected 的 Promises,直到遇到第一个 fulfilled 的 Promise。
示例
使用 Promise.any()
Promise.any() 会以第一个 fulfilled 的 Promise 来 fulfilled,即使有 Promise 先 rejected。这与 Promise.race() 不同,后者会以第一个已结算的 Promise 来 fulfilled 或 rejected。
const pErr = new Promise((resolve, reject) => {
reject(new Error("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 fulfills first
});
// Logs:
// Done quick
使用 AggregateError 进行 rejection
如果没有任何 Promise fulfilled,Promise.any() 会以 AggregateError rejected。
const failure = new Promise((resolve, reject) => {
reject(new Error("Always fails"));
});
Promise.any([failure]).catch((err) => {
console.log(err);
});
// AggregateError: No Promise in Promise.any was resolved
显示加载的第一个图片
在此示例中,我们有一个函数,它获取一个图片并返回一个 blob。我们使用 Promise.any() 来获取几张图片,并显示第一个可用的图片(即其 Promise 已 resolved 的图片)。
async function fetchAndDecode(url, description) {
const res = await fetch(url);
if (!res.ok) {
throw new Error(`HTTP error! status: ${res.status}`);
}
const data = await res.blob();
return [data, description];
}
const coffee = fetchAndDecode("coffee.jpg", "Coffee");
const tea = fetchAndDecode("tea.jpg", "Tea");
Promise.any([coffee, tea])
.then(([blob, description]) => {
const objectURL = URL.createObjectURL(blob);
const image = document.createElement("img");
image.src = objectURL;
image.alt = description;
document.body.appendChild(image);
})
.catch((e) => {
console.error(e);
});
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-promise.any |
浏览器兼容性
加载中…