๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป ํ”„๋ก ํŠธ์—”๋“œ/๐Ÿ“š JS

[JS]๋ณ‘๋ ฌ์ ์œผ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ

by megan07 2024. 4. 19.

๋น„๋™๊ธฐ๋ฅผ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์—๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

1. Promise.all

์ˆœํšŒ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์— ์ฃผ์–ด์ง„ ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ดํ–‰ํ•œ ํ›„, ํ˜น์€ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜์„ ๋•Œ ์ดํ–‰ํ•˜๋Š” Promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ํ”„๋กœ๋ฏธ์Šค ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ฑฐ๋ถ€ํ•˜๋Š” ๊ฒฝ์šฐ, ์ฒซ ๋ฒˆ์งธ๋กœ ๊ฑฐ์ ˆํ•œ ํ”„๋กœ๋ฏธ์Šค์˜ ์ด์œ ๋ฅผ ์‚ฌ์šฉํ•ด ์ž์‹ ๋„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ ๊ฐ’์œผ๋กœ ๋“ค์–ด์˜จ ํ”„๋กœ๋ฏธ์Šค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฑฐ๋ถ€ ๋‹นํ•˜๋ฉด Promise.all()์€ ์ฆ‰์‹œ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. 

 

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then((values) => {
  console.log(values);
});
// Expected output: Array [3, 42, "foo"]

 

2. Promise.allSettled

Promise.allSettled() ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์–ด์ง„ ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ดํ–‰ํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•œ ํ›„, ๊ฐ ํ”„๋กœ๋ฏธ์Šค์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋กœ์˜ ์„ฑ๊ณต ์—ฌ๋ถ€์— ๊ด€๋ จ ์—†๋Š” ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜, ํ•ญ์ƒ ๊ฐ ํ”„๋กœ๋ฏธ์Šค์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์•Œ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋กœ๋“œ ํ•ด์•ผ ํ•˜๊ณ , ๊ทธ ์ค‘ ์—…๋กœ๋“œ์— ์‹คํŒจํ•œ ํŒŒ์ผ๋“ค๋งŒ ๋ชจ์•„์„œ ๋‹ค์‹œ ์—…๋กœ๋“œ๋ฅผ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Promise.allSettled๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Promise.allSettled๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด

1. ๋น„๋™๊ธฐ ์š”์ฒญ์„ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์„œ ์—…๋กœ๋“œ ์†๋„๋ฅผ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๊ณ , 

2. resolve, reject ๋ชจ๋“  ๋น„๋™๊ธฐ ์š”์ฒญ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„์— ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจํ•œ ํŒŒ์ผ๋“ค๋งŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

 

const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) =>
  setTimeout(reject, 100, 'foo'),
);
const promises = [promise1, promise2];

Promise.allSettled(promises).then((results) =>
  results.forEach((result) => console.log(result.status)),
);

// Expected output:
// "fulfilled"
// "rejected"

 

Promise.all์„ ์‚ฌ์šฉํ•ด์„œ ์ด๋Ÿฐ์‹์œผ๋กœ Promsie.allSettled๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

function allSettled(promises) {
    let wrappedPromises = promises.map(p => Promise.resolve(p)
        .then(
            val => ({ status: 'fulfilled', value: val }),
            err => ({ status: 'rejected', reason: err })));
    return Promise.all(wrappedPromises);
}

 

 

 

 

 

3. Promise.race

iterable ์•ˆ์— ์žˆ๋Š” ํ”„๋กœ๋ฏธ์Šค ์ค‘์— ๊ฐ€์žฅ ๋จผ์ € ์™„๋ฃŒ๋œ ๊ฒƒ์˜ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๊ทธ๋Œ€๋กœ ์ดํ–‰ํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

 

const promise1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, 'one');
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then((value) => {
  console.log(value);
  // Both resolve, but promise2 is faster
});
// Expected output: "two"

 

 

 

์œ„ ์„ธ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ ๋ชจ๋‘ ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ˜ธํ™˜๋œ๋‹ค.

 

 

 

 

 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

https://stackoverflow.com/questions/30569182/promise-allsettled-in-babel-es6-implementation