Promise.any()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itโs been available across browsers since โจ2020๋ 9์โฉ.
Promise.any()
์ ์ ๋ฉ์๋๋ ์ํ ๊ฐ๋ฅํ ์ฌ๋ฌ ํ๋ก๋ฏธ์ค๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ ๋จ์ผ Promise
๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ๋ฐํ๋ ํ๋ก๋ฏธ์ค๋ ์
๋ ฅ์ผ๋ก ๋ค์ด์จ ์ฌ๋ฌ ํ๋ก๋ฏธ์ค ์ค ํ๋๋ผ๋ ์ดํ๋๋ฉด ์ด๋ฅผ ์ดํ ๊ฐ์ผ๋ก ํ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํฉ๋๋ค. ์
๋ ฅ์ ๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ๊ฑฐ๋ถ๋๋ฉด(๋น ๋ฐ๋ณต์ด ์ ๋ฌ๋ ๊ฒฝ์ฐ ํฌํจ) ์ต์ข
์ ์ผ๋ก ์ด ๋ฉ์๋๋ ๊ฑฐ๋ถ๋๋ฉฐ, ๊ฑฐ๋ถ๋ ์ฌ์ ๊ฐ ๋ฐฐ์ด์ด ํฌํจ๋ AggregateError
๊ฐ ๋ฐํ๋ฉ๋๋ค.
์๋ํด ๋ณด๊ธฐ
const promise1 = Promise.reject(0);
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)
๋งค๊ฐ๋ณ์
iterable
-
Array
์ ๊ฐ์ ํ๋ก๋ฏธ์ค์ ์ํ ๊ฐ๋ฅ ํ๋กํ ์ฝ์ ๋๋ค.
๋ฐํ ๊ฐ
๋ค์์ Promise
์
๋๋ค.
- ์ ๋ฌ๋
iterable
์ด ๋น์ด์๋ค๋ฉด, ์ด๋ฏธ ๊ฑฐ๋ถ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํฉ๋๋ค. - ์ฃผ์ด์ง
iterable
๋ด์ ํ๋ก๋ฏธ์ค ์ค ํ๋๋ผ๋ ์ดํ๋๋ฉด, ๋น๋๊ธฐ์ ์ผ๋ก ์ดํ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํฉ๋๋ค. ์ดํ ๊ฐ์ ๊ฐ์ฅ ๋จผ์ ์ดํ๋ ํ๋ก๋ฏธ์ค์ ์ดํ ๊ฐ์ ๋๋ค. - ์ฃผ์ด์ง
iterable
๋ด์ ๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ๊ฑฐ๋ถ๋๋ฉด, ๋น๋๊ธฐ์ ์ผ๋ก ๊ฑฐ๋ถ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํฉ๋๋ค. ๊ฑฐ๋ถ ์ด์ ๋errors
์์ฑ์ ์ฌ๋ฌ ๊ฑฐ๋ถ ์ด์ ์ ๋ฐฐ์ด์ด ์๋AggregateError
์ ๋๋ค. ์ค๋ฅ๋ ์๋ฃ ์์์ ๊ด๊ณ์์ด ์ ๋ฌ๋ ํ๋ก๋ฏธ์ค์ ์์๋๋ก ์ ๋ ฌ๋ฉ๋๋ค. ์ ๋ฌ๋iterable
์ด ๋น์ด์์ง ์์ง๋ง ๋๊ธฐ ์ค์ธ ํ๋ก๋ฏธ์ค๊ฐ ์๋ ๊ฒฝ์ฐ, ๋ฐํ๋ ํ๋ก๋ฏธ์ค๋ ์ฌ์ ํ ๋น๋๊ธฐ์ ์ผ๋ก(๋๊ธฐ์ ์ด ์๋) ๊ฑฐ๋ถ๋ฉ๋๋ค.
์ค๋ช
Promise.any()
๋ฉ์๋๋ ํ๋ก๋ฏธ์ค ๋์์ฑ ๋ฉ์๋ ์ค ํ๋์
๋๋ค. ์ด ๋ฉ์๋๋ ์ดํ๋๋ ์ฒซ ๋ฒ์งธ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ํ๋ก๋ฏธ์ค๊ฐ ์ดํ๋๋ฉด ์ฆ์ ๋จ๋ฝ(short-circuit)๋๋ฏ๋ก, ํ๋๋ฅผ ์ฐพ์ ํ์๋ ๋ค๋ฅธ ํ๋ก๋ฏธ์ค๋ค์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
Promise.all()
๊ณผ ๋ฌ๋ฆฌ, ์ดํ ๊ฐ๋ค์ ๋ฐฐ์ด์ ๋ฐํํ๋ ๋์ ํ๋์ ์ดํ ๊ฐ๋ง ์ป์ต๋๋ค(์ ์ด๋ ํ๋์ ํ๋ก๋ฏธ์ค๊ฐ ์ดํ๋๋ค๊ณ ๊ฐ์ ํ ๋). ์ด๋ ํ๋์ ํ๋ก๋ฏธ์ค๋ง ์ดํ๋๋ฉด ๋๊ณ ์ด๋ค ๊ฒ์ด ์ดํ๋๋์ง๋ ์๊ด์์ ๋ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ ๋ค๋ฅธ ์ฐจ์ด์ ์ ์ด ๋ฉ์๋๊ฐ ๋น ์ํ ๊ฐ๋ฅ ๊ฐ์ฒด๋ฅผ ๋ฐ์ผ๋ฉด ๊ฑฐ๋ถํ๋ค๋ ๊ฒ์
๋๋ค. ์๋ํ๋ฉด ์ฌ์ค์ ์ํ ๊ฐ๋ฅ ๊ฐ์ฒด์ ์ดํ๋๋ ํญ๋ชฉ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค. Promise.any()
์ Promise.all()
์ Array.prototype.some()
๊ณผ Array.prototype.every()
์ ๋น๊ตํ ์ ์์ต๋๋ค.
๋ํ, ์ฒซ ๋ฒ์งธ๋ก ์ ์ฐฉ๋ ๊ฐ(์ดํ ๋๋ ๊ฑฐ๋ถ)์ ๋ฐํํ๋ Promise.race()
์ ๋ฌ๋ฆฌ, ์ด ๋ฉ์๋๋ ์ฒซ ๋ฒ์งธ๋ก ์ดํ๋ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด ๋ฉ์๋๋ ์ฒซ ๋ฒ์งธ ํ๋ก๋ฏธ์ค๊ฐ ์ดํ๋ ๋๊น์ง ๋ชจ๋ ๊ฑฐ๋ถ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฌด์ํฉ๋๋ค.
์์
Promise.any() ์ฌ์ฉํ๊ธฐ
Promise.any()
๋ ํ๋ก๋ฏธ์ค๊ฐ ๋จผ์ ๊ฑฐ๋ถ๋๋๋ผ๋ ์ดํ๋๋ ์ฒซ ๋ฒ์งธ ํ๋ก๋ฏธ์ค๋ก ์ดํ๋ฉ๋๋ค. ์ด๋ ์ฒซ ๋ฒ์งธ๋ก ์ ์ฐฉ๋๋ ํ๋ก๋ฏธ์ค๋ก ์ดํ ๋๋ ๊ฑฐ๋ถ๋๋ Promise.race()
์ ๋์กฐ๋ฉ๋๋ค.
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 ๊ฐ ๋จผ์ ์ดํ๋ฉ๋๋ค
});
// Logs:
// Done quick
AggregateError์ ํจ๊ป ๊ฑฐ๋ถ
Promise.any()
๋ ์ด๋ ํ ํ๋ก๋ฏธ์ค๋ ์ดํ๋์ง ์์ ๊ฒฝ์ฐ AggregateError
์ ํจ๊ป ๊ฑฐ๋ถ๋ฉ๋๋ค.
const failure = new Promise((resolve, reject) => {
reject("Always fails");
});
Promise.any([failure]).catch((err) => {
console.log(err);
});
// AggregateError: No Promise in Promise.any was resolved
์ฒ์ ๋ถ๋ฌ์จ ์ด๋ฏธ์ง ๋ณด์ฌ์ฃผ๊ธฐ
์ด ์์์์๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์์ Blob์ ๋ฐํํ๋ ํจ์๊ฐ ์์ต๋๋ค. Promise.any()
๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ฒซ ์ด๋ฏธ์ง(์ฆ, ํ๋ก๋ฏธ์ค๊ฐ ์ดํ๋ ์ด๋ฏธ์ง)๋ฅผ ํ์ํฉ๋๋ค.
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);
});
๋ช ์ธ์
Specification |
---|
ECMAScriptยฎ 2026 Language Specification # sec-promise.any |
๋ธ๋ผ์ฐ์ ํธํ์ฑ
Loadingโฆ