This page was translated from English by the community. Learn more and join the MDN Web Docs community.

View in English Always switch to English

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"

๊ตฌ๋ฌธ

js
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()์™€ ๋Œ€์กฐ๋ฉ๋‹ˆ๋‹ค.

js
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์™€ ํ•จ๊ป˜ ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค.

js
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()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฒซ ์ด๋ฏธ์ง€(์ฆ‰, ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ดํ–‰๋œ ์ด๋ฏธ์ง€)๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

js
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

๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ

๊ฐ™์ด ๋ณด๊ธฐ