[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