[JS] Promise ํ๋ก๋ฏธ์ค ๋ณ๋ ฌ์ฒ๋ฆฌ ๋ฉ์๋ ํบ์๋ณด๊ธฐ
TL;DR
๐ก ์ฒ๋ฆฌ(settled) ์ํ๋ ์ดํ(fulfilled) ๋๋ ๊ฑฐ์ (rejected) ์ํ๋ฅผ ๋ชจ๋ ํฌํจํ๋ค.
- Promise.all: ๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ์ดํ๋์ด์ผ๋ง ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด๋ก ๋ฐํํ๋ค. ํ๋ก๋ฏธ์ค๊ฐ ํ๋๋ผ๋ ๊ฑฐ์ ๋๋ฉด ์ ์ฒด๊ฐ ๊ฑฐ์ ๋๋ค.
- Promise.allSettled: ๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ์ฒ๋ฆฌ(์ดํ ๋๋ ๊ฑฐ์ )๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด๋ก ๋ฐํํ๋ค.
- Promise.race: ๊ฐ์ฅ ๋จผ์  ์ฒ๋ฆฌ(์ดํ ํน์ ๊ฑฐ์ ) ์ํ๊ฐ ๋ ํ๋ก๋ฏธ์ค ์ฒ๋ฆฌ๋ฅผ ๋ฐํํ๋ค.
- Promise.any: ํ๋ก๋ฏธ์ค ์ค ํ๋๋ผ๋ ์ดํ๋๋ฉด ํด๋น ๊ฐ์ ๋ฐํํ๋ค. ๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ๊ฑฐ์ ๋๋ฉด ๊ฑฐ์  ์ด์ ๋ฅผ ๋ด์ AggregateError๋ฅผ ๋ฐํํ๋ค.
Promise.all
๐ก ํ๋ก๋ฏธ์ค ํ์ ์ฒ๋ฆฌ ๋ฉ์๋๋ฅผ ์ด์ฉํ ์ฒด์ด๋์ ์์ฐจ์  ์ฒ๋ฆฌ, Promise.all์ ๋ณ๋ ฌ(๋์) ์ฒ๋ฆฌ ์ฐจ์ด์  ๊ธฐ์ต. Promise.all์ ๋ง์ง๋ง ์ดํ(fulfilled) ์ํ๊ฐ ๋ ํ๋ก๋ฏธ์ค์ ์ฒ๋ฆฌ ์๊ฐ๋ณด๋ค ์กฐ๊ธ ๋ ๊ธธ๋ค.
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
Promise.all ๋ฉ์๋๋ ์ฌ๋ฌ ๊ฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ  ์ ์๋ค. ์ฌ๋ฌ ๊ฐ์ ํ๋ก๋ฏธ์ค๋ฅผ ๋์์ ์คํ์ํค๊ณ , ๋ชจ๋  ํ๋ก๋ฏธ์ค๊ฐ fulfilled(์ดํ) ์ํ๊ฐ ๋ ํ ์์
์ ์ฒ๋ฆฌ ํด์ผํ  ๋ ์ฌ์ฉํ๋ค.
Promise.all ๋ฉ์๋๋ ์ฒ๋ฆฌ ์์๋ฅผ ๋ณด์ฅํ๋ฉฐ, ์ ๋ฌ๋ฐ์ ํ๋ก๋ฏธ์ค๊ฐ 1๊ฐ๋ผ๋ rejected ์ํ๊ฐ ๋๋ฉด ๋๋จธ์ง ํ๋ก๋ฏธ์ค๊ฐ ์ดํ ์ํ๊ฐ ๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ  ์ฆ์ ์ข
๋ฃํ๋ ํน์ง์ด ์๋ค.
// Promise.all ๊ธฐ๋ณธ ๊ตฌ๋ฌธ
const promise = Promise.all([promise1, promise2, ...]);
// then ๋์  Promise.all ์์ await ํค์๋ ๋ถ์ฌ์ ๊ฒฐ๊ณผ๊ฐ์ results ๋ณ์์ ์ ์ฅ
const results = await Promise.all([promise1, promise2, ...]); // [...]
const [res1, res2] = await Promise.all([promise1, promise2, ...]); // [...]
Promise.all ๋ฉ์๋๋ ํ๋ก๋ฏธ์ค๋ฅผ ์์๋ก ๊ฐ๋ ์ดํฐ๋ฌ๋ธ(๋ฐฐ์ด, ๋ฌธ์์ด ๋ฑ)์ ์ธ์๋ก ๋ฐ๋๋ค. ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ดํฐ๋ฌ๋ธ์ ์์๊ฐ ํ๋ก๋ฏธ์ค๊ฐ ์๋๋ฉด, ์๋ฌต์ ์ผ๋ก Promise.resolve ๋ฉ์๋๋ฅผ ์ด์ฉํด ํ๋ก๋ฏธ์ค๋ก ๋ํํ๋ค.
Promise.all([
  1, // Promise.resolve(1) ์ ๋์ผ
  2, // Promise.resolve(2) ์ ๋์ผ
]).then(console.log); // [1, 2]
Promise.all์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ฐฐ์ด์ ๋ชจ๋  ํ๋ก๋ฏธ์ค๊ฐ fulfilled ์ํ๊ฐ ๋๋ฉด ์ข
๋ฃ๋๋ค. ๋ชจ๋  ํ๋ก๋ฏธ์ค๊ฐ fullfilled ์ํ๊ฐ ๋๋ฉด resolved๋ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด์ ์ ์ฅํ์ฌ ์๋ก์ด ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ค. Promise.all์ ์ฒ๋ฆฌ ์์๋ฅผ ๋ณด์ฅํ๋ ํน์ง์ด ์๋ค. ์ฆ, ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ํญ์ Promise.all ์ธ์์ ์ ๋ฌํ ์์์ ๊ฐ๋ค. ์๋ฅผ๋ค์ด ์ฒซ๋ฒ์งธ ํ๋ก๋ฏธ์ค๊ฐ ๊ฐ์ฅ ๋ฆ๊ฒ fulfilled ๋์ด๋ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ํญ์ ์ฒซ๋ฒ์งธ ์์์ ์์นํ๋ค.
Promise.all([
  new Promise((resolve) => setTimeout(() => resolve(1), 5000)), // 3๋ฒ์งธ ์ดํ
  new Promise((resolve) => setTimeout(() => resolve(2), 3000)), // 2๋ฒ์งธ ์ดํ
  new Promise((resolve) => setTimeout(() => resolve(3), 1000)), // 1๋ฒ์งธ ์ดํ
]).then(console.log); // ๋ชจ๋  ํ๋ก๋ฏธ์ค๊ฐ ์ฒ๋ฆฌ๋๋ฉด [1, 2, 3] ์ถ๋ ฅ
Promise.all์ด ์ธ์๋ก ๋ฐ์ ํ๋ก๋ฏธ์ค๊ฐ ํ๋๋ผ๋ rejected ์ํ๊ฐ ๋๋ฉด ๋๋จธ์ง ํ๋ก๋ฏธ์ค๊ฐ fulfilled ์ํ๊ฐ ๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ  ์ฆ์ ์ข
๋ฃํ๋ค. ์ฆ, 1๊ฐ ํ๋ก๋ฏธ์ค๊ฐ ๊ฑฐ์ ๋๋ฉด Promise.all ์ ์ฒด๊ฐ ๊ฑฐ์ ๋๊ณ  ์ดํ๋ ํ๋ก๋ฏธ์ค ๊ฒฐ๊ณผ๋ ๋ฌด์๋๋ค. ์ด๋ ๊ฐ์ฅ ๋จผ์  ๊ฑฐ์ ๋ ํ๋ก๋ฏธ์ค์ ์๋ฌ๊ฐ catch ๋ฉ์๋๋ก ์ ๋ฌ๋๋ฉฐ, Promise.all ์ ์ฒด์ ๊ฒฐ๊ณผ๊ฐ ๋๋ค.
์๋ฌ ๋ฐ์์ผ๋ก ์ ์ฒด Promise.all์ด ์ข
๋ฃ๋๋ ์ํฉ โผ
Promise.all([
  new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)),
  new Promise((resolve, reject) => setTimeout(() => reject(new Error('์๋ฌ 2')), 2000)),
  new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000)),
])
  .then(console.log) // ๊ฑด๋๋
  .catch(console.error); // Error: ์๋ฌ 2 (์๋ฌ ๋ฐ์ํ์ผ๋ฏ๋ก Promise.all ์ข
๋ฃ)
์ฌ๋ฌ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ํฉ โผ
Promise.all([
  new Promise((_, reject) => setTimeout(() => reject(new Error('์๋ฌ 1')), 5000)),
  new Promise((_, reject) => setTimeout(() => reject(new Error('์๋ฌ 2')), 3000)),
  new Promise((_, reject) => setTimeout(() => reject(new Error('์๋ฌ 3')), 1000)),
])
  .then(console.log) // ๊ฑด๋๋
  .catch(console.error); // Error: ์๋ฌ 3 (๊ฐ์ฅ ๋จผ์  ์๋ฌ๊ฐ ๋ฐ์ํ ํ๋ก๋ฏธ์ค)
ํ์ฉ ์์ โญ๏ธ
์ฌ๋ฌ ์์ ์ ํ๋ก๋ฏธ์ค๋ก ๊ตฌ์ฑ๋ ๋ฐฐ์ด๋ก ๋ง๋ ํ
Promise.all์ ์ด์ฉํด ๋ณ๋ ฌ ์ฒ๋ฆฌํ๋ ์์
map ๊ฐ์ ๋ฐฐ์ด ๋ฉ์๋ ์ฝ๋ฐฑ์ async, await ํค์๋๋ฅผ ์ฌ์ฉํด๋ ์ฌ์ ํ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ค. ๋ฐฐ์ด ๋ฉ์๋๋ ๊ฐ ์์๋ฅผ ์ํํ๋ฉฐ ์ฝ๋ฐฑ์ ํธ์ถํ๊ณ  ์ข
๋ฃ ์ฌ๋ถ์ ์๊ด์์ด ๋ค์ ์ฝ๋ฐฑ์ ์คํ์ํค๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ์ฝ๋ฐฑ ํจ์ ์์ฒด๋ ๋๊ธฐ๋ก ์๋ํ์ง๋ง ๊ฐ ์ฝ๋ฐฑ์ ๋น๋๊ธฐ๋ก ์คํ์ํจ๋ค.
์๋ชป๋ ์์ โ
const baseUrl = 'https://api.github.com/users';
const urls = [`${baseUrl}/iliakan`, `${baseUrl}/remy`, `${baseUrl}/jeresig`];
// requests -> [Promise, Promise, Promise]
const requests = urls.map(async (url) => await fetch(url));
์ฌ๋ฐ๋ฅธ ์์ โ
const baseUrl = 'https://api.github.com/users';
const urls = [`${baseUrl}/iliakan`, `${baseUrl}/remy`, `${baseUrl}/jeresig`];
// fetch API๋ฅผ ์ด์ฉํด url์ ํ๋ก๋ฏธ์ค๋ก ๋งคํ
// fetch API๋ HTTP ์๋ต์ ๋ํ๋ด๋ Response ๊ฐ์ฒด๋ฅผ ๋ํํ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ค
// requests -> [Promise, Promise, Promise]
const requests = urls.map(url => fetch(url));
// Promise.all์ ๋ชจ๋  ์์
์ด ์ดํ๋  ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ,
// ๊ฐ ์์์ ํ๋ก๋ฏธ์ค ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด์ ์ ์ฅํด ์๋ก์ด ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ค
Promise.all(requests)
  // ๋ชจ๋  ์๋ต์ด ์ฑ๊ณต์ ์ผ๋ก ์ดํ๋๋ฉด then ๋ฉ์๋์ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๊ณ ,
  // ์ฝ๋ฐฑ ํจ์์ ์ธ์์ ํ๋ก๋ฏธ์ค ์ฒ๋ฆฌ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ(๋ฐฐ์ด)๋ฅผ ์ ๋ฌํ๋ค
  .then(responses => // [Response, Response, Response]
    responses.forEach(response => // Response {type: 'cors', url: '...', status: 200, ...}
      console.log(`${response.url}: ${response.status}`),
    ),
  );
GitHub ์ ์  ๋ค์์ด ๋ด๊ธด ๋ฐฐ์ด์ ์ด์ฉํด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ์์ โผ
const baseUrl = 'https://api.github.com/users';
const names = ['iliakan', 'remy', 'jeresig'];
// fetch API๋ HTTP ์๋ต์ ๋ํ๋ด๋ Response ๊ฐ์ฒด๋ฅผ ๋ํํ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ค
// requests -> [Promise, Promise, Promise]
const requests = names.map((name) => fetch(`${baseUrl}/${name}`));
// Promise.all์ ๋ชจ๋  ์์
์ด ์ดํ๋  ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ
// ๊ฐ ์์์ ํ๋ก๋ฏธ์ค ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด์ ์ ์ฅํด ์๋ก์ด ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ค
Promise.all(requests)
  // ๋ชจ๋  ์๋ต์ด ์ฑ๊ณต์ ์ผ๋ก ์ดํ๋๋ฉด then ๋ฉ์๋์ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๊ณ ,
  // ์ฝ๋ฐฑ ํจ์์ ์ธ์์ ํ๋ก๋ฏธ์ค ์ฒ๋ฆฌ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ(๋ฐฐ์ด)๋ฅผ ์ ๋ฌํ๋ค
  .then((responses) => {
    // [Response, Response, Response]
    for (const response of responses) {
      console.log(`${response.url}: ${response.status}`);
      // 'https://api.github.com/users/iliakan: 200', ...
    }
    return responses;
  })
  // Response ๊ฐ์ฒด์ ์๋ json() ๋ฉ์๋๋ฅผ ์ด์ฉํด body ๋ด์ฉ์ JSON ํํ๋ก ํ์ฑํ๋ค
  .then((responses) => Promise.all(responses.map((r) => r.json())))
  // ํ์ฑ๋ ๊ฐ ๊ฐ์ฒด๊ฐ ๋ด๊ธด ๋ฐฐ์ด์ then ๋ฉ์๋์ ์ฝ๋ฐฑ ํจ์ ์ธ์(users)๋ก ์ ๋ฌ๋๋ค.
  .then((users) => users.forEach((user) => console.log(user.name)));
์๋์ฒ๋ผ ์ฝ๋๋ฅผ ์ข ๋ ๊ฐ์ํํ  ์๋ ์๋ค. ์ฐธ๊ณ ๋ก then ๋ฉ์๋๋ ํญ์ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ค. then ๋ฉ์๋์ ์ ๋ฌํ ์ฝ๋ฐฑ์ด ํ๋ก๋ฏธ์ค๊ฐ ์๋ ๊ฐ์ ๋ฐํํ๋ฉด ์๋ฌต์ ์ผ๋ก resolve ํน์ rejectํ ํ๋ก๋ฏธ์ค๋ฅผ ์์ฑํ ํ ๋ฐํํ๋ค.
const baseUrl = 'https://api.github.com/users';
const names = ['iliakan', 'remy', 'jeresig'];
// ์ฝ๋ ํ๊ฐ์ then ํ์ ๋ฉ์๋ ์คํ -> then ๋ฉ์๋์ ์ฝ๋ฐฑ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ resolveํ ํ๋ก๋ฏธ์ค ๋ฐํ
// requests -> [Promise, Promise, Promise]
const requests = names.map((n) =>
  fetch(`${baseUrl}/${n}`).then((res) => res.json()),
);
// responses -> [{ id: 349336, name: 'Ilya Kantor', ... }, {...}, {...}]
const responses = await Promise.all(requests);
Promise.race
Promise.race ๋ฉ์๋๋ ๋ชจ๋  ํ๋ก๋ฏธ์ค๊ฐ ์ดํ(fulfilled) ์ํ๊ฐ ๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ , ๊ฐ์ฅ ๋จผ์  ์ฒ๋ฆฌ๋(fulfilled ํน์ rejected) ํ๋ก๋ฏธ์ค ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
Promise.race([
  new Promise((resolve) => setTimeout(() => resolve(1), 5000)), // 3๋ฒ์งธ ์ดํ
  new Promise((resolve) => setTimeout(() => resolve(2), 3000)), // 2๋ฒ์งธ ์ดํ
  new Promise((resolve) => setTimeout(() => resolve(3), 1000)), // 1๋ฒ์งธ ์ดํ
]).then(console.log); // 3 (๊ฐ์ฅ ๋จผ์  "์ฒ๋ฆฌ"๋ ํ๋ก๋ฏธ์ค ๊ฒฐ๊ณผ)
๊ฐ์ฅ ๋จผ์  ์ฒ๋ฆฌ๋ ํ๋ก๋ฏธ์ค์ ๊ฒฐ๊ณผ๊ฐ ๊ฑฐ์ (rejected)๋ผ๋ฉด ๊ฑฐ์ ๋ ํ๋ก๋ฏธ์ค์ ์๋ฌ๋ฅผ ์ฆ์ ๋ฐํํ๋ค.
Promise.race([
  new Promise((_, reject) => setTimeout(() => reject(new Error('์๋ฌ 1')), 5000)),
  new Promise((_, reject) => setTimeout(() => reject(new Error('์๋ฌ 2')), 3000)),
  new Promise((_, reject) => setTimeout(() => reject(new Error('์๋ฌ 3')), 1000)),
])
  .then(console.log) // ๊ฑด๋๋
  .catch(console.error); // Error: ์๋ฌ 3 (๊ฐ์ฅ ๋จผ์  "์ฒ๋ฆฌ"๋ ํ๋ก๋ฏธ์ค ๊ฒฐ๊ณผ)
์๋ฌ๊ฐ ๋ฐ์ํ๋ 2๋ฒ์งธ ํ๋ก๋ฏธ์ค๋ณด๋ค 3๋ฒ์งธ ํ๋ก๋ฏธ์ค๊ฐ ๋จผ์  ์ฒ๋ฆฌ(settled) ๋์ผ๋ฏ๋ก ์ฝ์์ 3์ ์ถ๋ ฅํ๋ค.
Promise.race([
  new Promise(resolve => setTimeout(() => resolve(1), 5000)),
  new Promise((_, reject) => setTimeout(() => reject(new Error('์๋ฌ 2')), 3000)),
  new Promise(resolve => setTimeout(() => resolve(3), 1000)), // 1๋ฒ์งธ ์ดํ
])
  .then(console.log) // 3 (๊ฐ์ฅ ๋จผ์  "์ฒ๋ฆฌ"๋ ํ๋ก๋ฏธ์ค ๊ฒฐ๊ณผ)
  .catch(console.error); // ๊ฑด๋๋
Promise.allSettled
Promise.allSettled ๋ฉ์๋๋ ์ธ์๋ก ๋ฐ์ ํ๋ก๋ฏธ์ค๊ฐ ๋ชจ๋ settled ์ํ(fulfilled ํน์ rejected)๊ฐ ๋๋ฉด ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด๋ก ๋ฐํํ๋ค. ์ฆ rejected ์ํ์ ์๊ด์์ด ๋ชจ๋  ํ๋ก๋ฏธ์ค์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ ์๋ค. ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํด๋ catch ๋ฉ์๋๋ ์คํ๋์ง ์๋๋ค.
Promise.allSettled([
  new Promise((resolve) => setTimeout(() => resolve(1), 5000)),
  new Promise((_, reject) => setTimeout(() => reject(new Error('์๋ฌ 2')), 3000)),
  new Promise((resolve) => setTimeout(() => resolve(3), 1000)),
])
  .then(console.log) // [{…}, {…}, {…}] (์๋ ์ฃผ์ ์ฐธ๊ณ )
  .catch(console.error); // ๊ฑด๋๋
/*
[
  { "status": "fulfilled", "value": 1 },
  { "status": "rejected", "reason": Error: ์๋ฌ 2 at <anonymous>:3:54 },
  { "status": "fulfilled", "value": 3 }
]
*/
- fulfilled ์ํ์ผ ๋ ํ๋กํผํฐ : ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ํ status, ์ฒ๋ฆฌ ๊ฒฐ๊ณผvalue
- rejected ์ํ์ผ ๋ ํ๋กํผํฐ : ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ํ status, ์๋ฌ๋ฅผ ๋ํ๋ด๋reason
๐ก Promise.all ๋ฉ์๋๋ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ํ๋ก๋ฏธ์ค๊ฐ 1๊ฐ๋ผ๋ rejected ์ํ๊ฐ ๋๋ฉด ๋๋จธ์ง ํ๋ก๋ฏธ์ค๊ฐ ์ดํ ์ํ๊ฐ ๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ  ์ฆ์ ์ข
๋ฃํ๋ค. ์ด๋ ์ดํ๋ ๋ค๋ฅธ ํ๋ก๋ฏธ์ค ๊ฒฐ๊ณผ๋ ๋ฌด์๋๊ณ , ๊ฑฐ์ ๋ ํ๋ก๋ฏธ์ค์ ์๋ฌ๊ฐ Promise.all ์ ์ฒด์ ๊ฒฐ๊ณผ๊ฐ ๋๋ค.
Promise.any
Promise.any๋ ๊ฑฐ์ ๋ ํ๋ก๋ฏธ์ค๊ฐ ์์ด๋ ์ฒซ๋ฒ์งธ๋ก ์ดํ(fulfilled) ์ํ๊ฐ ๋ ํ๋ก๋ฏธ์ค์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค. ์ฆ, ๊ฐ์ฅ ๋จผ์  ์ดํ ์ํ๊ฐ ๋ ํ๋ก๋ฏธ์ค ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค. ๋ง์ฝ โถ์ธ์๋ก ๋ฐ์ ํ๋ก๋ฏธ์ค๋ค์ด ๋ชจ๋ ๊ฑฐ์  ์ํ๊ฐ ๋๊ฑฐ๋, โท๋น ๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ์์ ๋ ์๋ฌ(AggregateError)๋ฅผ ๋ฐํํ๋ค.
์ดํ / ๊ฑฐ์  ์ํ์ ํ๋ก๋ฏธ์ค๊ฐ ํจ๊ป ์์ ๋ โผ
Promise.any([
  new Promise((_, reject) => setTimeout(() => reject(new Error('์๋ฌ 1'))), 1000),
  new Promise((resolve) => setTimeout(() => resolve(2), 3000)), // 1๋ฒ์งธ ์ดํ
  new Promise((resolve) => setTimeout(() => resolve(3), 5000)),
])
  .then(console.log) // 2 (๊ฐ์ฅ ๋จผ์  "์ดํ"๋ ํ๋ก๋ฏธ์ค ๊ฒฐ๊ณผ)
  .catch(console.error); // ๊ฑด๋๋
๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ๊ฑฐ์  ์ํ์ผ ๋ โผ
Promise.any([
  new Promise((_, reject) => setTimeout(() => reject(new Error('์๋ฌ 1')), 5000)),
  new Promise((_, reject) => setTimeout(() => reject(new Error('์๋ฌ 2')), 3000)),
  new Promise((_, reject) => setTimeout(() => reject(new Error('์๋ฌ 3')), 1000)),
])
  .then(console.log) // ๊ฑด๋๋
  .catch(console.error); // AggregateError: All promises were rejected
๋น ๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ์์ ๋ โผ
Promise.any([]).then(console.log).catch(console.error);
// AggregateError: All promises were rejected
๐ก Promise.race vs Promise.any
- Promise.race: ์ดํ/๊ฑฐ์  ์ฌ๋ถ์ ์๊ด์์ด ๊ฐ์ฅ ๋จผ์  ์ฒ๋ฆฌ๋(settled) ํ๋ก๋ฏธ์ค ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค
- Promise.any: ๊ฑฐ์ ๋ ํ๋ก๋ฏธ์ค๊ฐ ์์ด๋ ๋ค๋ฅธ ํ๋ก๋ฏธ์ค๊ฐ ์ดํ ์ํ๊ฐ ๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฐ๋ค. ๋ค๋ฅธ ํ๋ก๋ฏธ์ค๊ฐ ํ๋๋ผ๋ ์ดํ ์ํ๊ฐ ๋๋ฉด ํด๋น ํ๋ก๋ฏธ์ค์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ฆ์ ๋ฐํํ๋ค.
๋ ํผ๋ฐ์ค
- ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ : Promise API - chanyeong
- Promise.all() - JavaScript | MDN
- ํ๋ผ๋ฏธ์ค API
- Promise | PoiemaWeb
๊ธ ์์ ์ฌํญ์ ๋ ธ์  ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
- 
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ 
- 
์นด์นด์คํก
์นด์นด์คํก 
- 
๋ผ์ธ
๋ผ์ธ 
- 
ํธ์ํฐ
ํธ์ํฐ 
- 
Facebook
Facebook 
- 
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ 
- 
๋ฐด๋
๋ฐด๋ 
- 
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ 
- 
Pocket
Pocket 
- 
Evernote
Evernote 
๋ค๋ฅธ ๊ธ
- 
[DevTools] iPhone ์์ดํฐ ์ฌํ๋ฆฌ์์ ๋๋ฒ๊น / ์ฝ์ ์ฌ์ฉํ๊ธฐ[DevTools] iPhone ์์ดํฐ ์ฌํ๋ฆฌ์์ ๋๋ฒ๊น / ์ฝ์ ์ฌ์ฉํ๊ธฐ2024.05.16
- 
[JS/React] input ํ๋์ ์ซ์๋ง ์ ๋ ฅ ํ์ฉํ๊ธฐ (ํ๊ธ ์ ๋ ฅ ๋ฐฉ์ง)[JS/React] input ํ๋์ ์ซ์๋ง ์ ๋ ฅ ํ์ฉํ๊ธฐ (ํ๊ธ ์ ๋ ฅ ๋ฐฉ์ง)2024.05.16
- 
[JS] ํ์ ์ด๋ฆ์ ๋ฐํํ๋ getType ์ ํธ ํจ์[JS] ํ์ ์ด๋ฆ์ ๋ฐํํ๋ getType ์ ํธ ํจ์2024.05.14
- 
[Next.js] ๋ผ์ฐํธ ๋ณ๊ฒฝ / ์๋ก๊ณ ์นจ ์ทจ์ํ๊ธฐ (๋ค๋น๊ฒ์ด์  ๊ฐ๋)[Next.js] ๋ผ์ฐํธ ๋ณ๊ฒฝ / ์๋ก๊ณ ์นจ ์ทจ์ํ๊ธฐ (๋ค๋น๊ฒ์ด์  ๊ฐ๋)2024.05.14