19. Promise

์–‘ํฌ์ค€ยท2022๋…„ 4์›” 23์ผ
0

JavaScript Info

๋ชฉ๋ก ๋ณด๊ธฐ
19/19
post-thumbnail

๐Ÿ“Œ 19-1 ํ”„๋กœ๋ฏธ์Šค๋ž€?

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋…์„ฑ๊ณผ ์—๋Ÿฌ ์ฒ˜๋ฆฌ์˜ ํ•œ๊ณ„ ๋•Œ๋ฌธ์— ES6์—์„œ ๋„์ž…๋œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์ด๋‹ค.

๐Ÿ“Œ 19-2 ํ”„๋กœ๋ฏธ์Šค ์‚ฌ์šฉ๋ฐฉ๋ฒ•

  • Promise ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ new ์—ฐ์‚ฐ์ž๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • resolve์™€ reject ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด resolve ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ•˜๋ฉด reject ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
  • resolve, reject ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๊ณ  ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ์•ˆ์—๋Š” ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ์™€ ํ”„๋กœ๋ฏธ์Šค์˜ ๊ฒฐ๊ณผ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.

๐Ÿงฉ ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ

ํ”„๋กœ๋ฏธ์Šค ์ƒํƒœ์ƒํƒœ์„ค๋ช…
pendingํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ธํ•ด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ ์ƒํƒœ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์€ ์ƒํƒœ
fulfilled๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•œ ์ƒํƒœresolve ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
rejected๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ•œ ์ƒํƒœreject ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

๐Ÿงฉ pending ์ƒํƒœ

const isChecked = true;
// ํ”„๋กœ๋ฏธ์Šค ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
const promise = new Promise((resolve, reject) => {
    // pending ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์ฝ”๋“œ ์ฃผ์„์œผ๋กœ ์ฒ˜๋ฆฌ
    // if(isChecked) resolve("Success");
    // else reject("Fail");
});
// ๊ฒฐ๊ณผ : Promise {<pending>}
console.log(promise);

๐Ÿงฉ fulfilled ์ƒํƒœ

// ์„ฑ๊ณต๊ณผ ์‹คํŒจ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”
const isChecked = true;
const promise = new Promise((resolve, reject) => {
    // ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์„ฑ๊ณตํ•˜๋„๋ก ์กฐ๊ฑด๋ฌธ์œผ๋กœ ์‹คํ–‰
    if(isChecked) resolve("Success");
    else reject("Fail");
});
// ๊ฒฐ๊ณผ : Promise {<fulfilled>: 'Success'}
console.log(promise);

๐Ÿงฉ rejected ์ƒํƒœ

// ์„ฑ๊ณต๊ณผ ์‹คํŒจ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”
const isChecked = false;
const promise = new Promise((resolve, reject) => {
    // ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์‹คํŒจํ•˜๋„๋ก ์กฐ๊ฑด๋ฌธ ์‹คํ–‰
    if(isChecked) resolve("Success");
    else reject("Fail");
});
// ๊ฒฐ๊ณผ : Promise {<rejected>: 'Fail'}
console.log(promise);

๐Ÿ”ฅ ์กฐ๊ฑด๋ฌธ์œผ๋กœ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ๋‚˜๋ˆ„์ง€ ์•Š์œผ๋ฉด ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ˆœ์„œ๋Œ€๋กœ ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ๊ฐ€ ๊ฒฐ์ • ๋œ๋‹ค.

const promise = new Promise((resolve, reject) => {
    resolve("Success");
    reject("Fail");
});
// ๊ฒฐ๊ณผ : Promise {<fulfilled>: 'Success'}
console.log(promise);
const promise = new Promise((resolve, reject) => {
    reject("Fail")
    resolve("Success");
});
// ๊ฒฐ๊ณผ : Promise {<rejected>: 'Fail'}
console.log(promise);

๐Ÿ“Œ 19-3 ํ”„๋กœ๋ฏธ์Šค ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ

ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์˜ [[PromiseState]]์™€ [[PromiseResult]] ํ”„๋กœํผํ‹ฐ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๋กœ ํ”„๋กœ๋ฏธ์Šค์˜ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ [[PromiseResult]]์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํ”„๋กœ๋ฏธ์Šค ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋Š” ๋ชจ๋‘ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•œ๋‹ค.
  • ํ”„๋กœ๋ฏธ์Šค ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์˜ ๊ฒฐ๊ณผ๊ฐ’์€ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿ’ก ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์˜ [[PromiseResult]]๋งŒ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์˜ค๋Š” ์ด์œ ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ˜•์‹์ธ๊ฒƒ ๊ฐ™๋‹ค.

๐Ÿ“‹ Promise.prototype.then("์„ฑ๊ณต ์ฒ˜๋ฆฌ ์ฝœ๋ฐฑ ํ•จ์ˆ˜", "์‹คํŒจ ์ฒ˜๋ฆฌ ์ฝœ๋ฐฑ ํ•จ์ˆ˜")

  • ์„ฑ๊ณต ์ฒ˜๋ฆฌ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” resolve ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค.
  • ์‹คํŒจ ์ฒ˜๋ฆฌ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” reject ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค.
const promise = new Promise((resolve, reject) => {
    resolve("Success");
});
// ๊ฒฐ๊ณผ : Success
promise.then((res) => console.log(res), (err) => console.log(err));
const promise = new Promise((resolve, reject) => {
    reject("Fail");
});
// ๊ฒฐ๊ณผ : Fail
promise.then((res) => console.log(res), (err) => console.log(err));

๐Ÿ“‹ Promise.prototype.catch("์‹คํŒจ ์ฒ˜๋ฆฌ ์ฝœ๋ฐฑ ํ•จ์ˆ˜")

  • ์‹คํŒจ ์ฒ˜๋ฆฌ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” reject ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค.
const promise = new Promise((resolve, reject) => {
    reject("Fail");
});
// ๊ฒฐ๊ณผ : Fail
promise.catch((err) => console.log(err));

๐Ÿ“‹ Promise.prototype.finally("๋ฌด์กฐ๊ฑด ์‹คํ–‰ํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜")

  • fulfilled, rejected ์ƒํƒœ์™€ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
const promise = new Promise((resolve, reject) => {
    resolve("Success");
});
// ๊ฒฐ๊ณผ : ์ƒํƒœ์™€ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ์‹คํ–‰
promise.finally(() => console.log("์ƒํƒœ์™€ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ์‹คํ–‰"));
const promise = new Promise((resolve, reject) => {
    reject("Fail");
});
// ๊ฒฐ๊ณผ : ์ƒํƒœ์™€ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ์‹คํ–‰
promise.finally(() => console.log("์ƒํƒœ์™€ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ์‹คํ–‰"));

๐Ÿ‘€ then ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ฑ๊ณต๊ณผ ์‹คํŒจ ๋‘๊ฐœ์˜ ๊ฒฝ์šฐ ์ „๋ถ€ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹œ๋ฉ˜ํ‹ฑ์ ์œผ๋กœ ์„ฑ๊ณต์€ then ์‹คํŒจ๋Š” catch ๊ณตํ†ต์ ์œผ๋กœ ์ฒ˜๋ฆฌ ํ•  ๊ฒฝ์šฐ finally ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ“Œ 19-4 ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๊ฐ€๋…์„ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋…์„ฑ ์žˆ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹์€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.
  • ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹์œผ๋กœ ์‚ฌ์šฉ๋œ ํ”„๋กœ๋ฏธ์Šค ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ „ ํ”„๋กœ๋ฏธ์Šค ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์˜ ๊ฒฐ๊ณผ๊ฐ’์ด๋‹ค.
  • catch ๋ฉ”์†Œ๋“œ๋Š” rejected ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉด ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.
// โ‘ 
const promise = new Promise((resolve, reject) => {
    resolve("Success");
});

promise
// โ‘ก
.then((res) => new Promise((resolve, reject) => resolve("์„ฑ๊ณต")))
// โ‘ข
.then((res) => console.log(res))
// โ‘ฃ
.finally(() => console.log("์‹คํ–‰ ์™„๋ฃŒ"));

๐Ÿ“‹ ์ฝ”๋“œ ๋™์ž‘ ์›๋ฆฌ
โ‘  ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
โ‘ก ํ”„๋กœ๋ฏธ์Šค ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์ธ then์„ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
โ‘ข ํŒŒ๋ผ๋ฏธํ„ฐ res์—๋Š” ์ „ ํ”„๋กœ๋ฏธ์Šค ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์˜ ๊ฒฐ๊ณผ๊ฐ’์ธ "์„ฑ๊ณต"์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.
โ‘ฃ ๋งˆ์ง€๋ง‰ ๋™์ž‘๊ณผ์ •์ธ finally ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด "์‹คํ–‰ ์™„๋ฃŒ"๋ฅผ ๋กœ๊ทธ์— ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ“Œ 19-5 ํ”„๋กœ๋ฏธ์Šค ์ •์  ๋ฉ”์†Œ๋“œ

Promise์˜ ์ •์  ๋ฉ”์†Œ๋“œ๋Š” 5๊ฐ€์ง€๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๐Ÿ“‹ Promise.resolve

  • ์กด์žฌํ•˜๋Š” ๊ฐ’์„ ์ „๋‹ฌํ•˜์—ฌ resolveํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
// fulfilled ์ƒํƒœ์˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
const resolve = Promise.resolve("Success");
// ๊ฒฐ๊ณผ : Success
resolve.then((res) => console.log(res));

๐Ÿ“‹ Promise.reject

  • ์กด์žฌํ•˜๋Š” ๊ฐ’์„ ์ „๋‹ฌํ•˜์—ฌ rejectํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
// rejected ์ƒํƒœ์˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
const reject = Promise.reject("Fail");
// ๊ฒฐ๊ณผ : Fail
reject.catch((err) => console.log(err));

๐Ÿ“‹ Promise.all

  • ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค์˜ ๊ฒฐ๊ณผ๋ฅผ ์ง‘๊ณ„ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. (๋ณ‘๋ ฌ์ฒ˜๋ฆฌ)
const data = [];
// resolve๊ฐ€ 1์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise1 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("1"), Math.random() * 1000);
});
// resolve๊ฐ€ 2์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise2 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("2"), Math.random() * 1000);
});
// resolve๊ฐ€ 3์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise3 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("3"), Math.random() * 1000);
});
// 3๊ฐœ์˜ resolve์˜ ๊ฐ’์„ data์ธ ๋ฐฐ์—ด์— ๋„ฃ๊ณ  ํ™•์ธ (์‹คํ–‰ ์ˆœ์„œ ๋ณด์žฅ X)
promise1.then((res) => {
    data.push(res);
    console.log(data);
});
promise2.then((res) => {
    data.push(res);
    console.log(data);
});
promise3.then((res) => {
    data.push(res);
    console.log(data);
});

์œ„ ์ฝ”๋“œ์˜ ๋ฌธ์ œ๋Š” ์‹คํ–‰ ์ˆœ์„œ๋„ ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ ์–ด๋–ค ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๋งˆ์ง€๋ง‰์— ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธ๋„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿงฉ ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹์œผ๋กœ ์ˆœ์ฐจ์  ์ฒ˜๋ฆฌ

const data = [];
// resolve๊ฐ€ 1์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise1 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("1"), Math.random() * 1000);
});
// resolve๊ฐ€ 2์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise2 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("2"), Math.random() * 1000);
});
// resolve๊ฐ€ 3์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise3 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("3"), Math.random() * 1000);
});
// return์œผ๋กœ Promise๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด์„œ ์ˆœ์„œ๋ฅผ ๋ณด์žฅ๋ฐ›๋Š”๋‹ค.
promise1
.then((res) => {
    data.push(res);
    return promise2;
})
.then((res) => {
    data.push(res);
    return promise3;
})
.then((res) => {
    data.push(res);
    // ๊ฒฐ๊ณผ : [1, 2, 3]
    console.log(data);
});

์ˆœ์„œ๋ฅผ ๋ณด์žฅ๋ฐ›์ง€๋งŒ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๋Š๋‚Œ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿงฉ Promise.all์˜ ์‚ฌ์šฉ๊ณผ ํŠน์ง•

  • ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ fulfilled ์ƒํƒœ์—ฌ์•ผ ํ•˜๋ฉฐ rejected ์ƒํƒœ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์žˆ์œผ๋ฉด ์ฆ‰์‹œ ์‹คํ–‰๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.
  • ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋กœ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•œ๋‹ค.
// resolve๊ฐ€ 1์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise1 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("1"), Math.random() * 1000);
});
// resolve๊ฐ€ 2์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise2 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("2"), Math.random() * 1000);
});
// resolve๊ฐ€ 3์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise3 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("3"), Math.random() * 1000);
});
// ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๋ฉฐ ๊ฐ€๋…์„ฑ๋„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค.
Promise.all([promise1, promise2, promise3])
// ๊ฒฐ๊ณผ : [1, 2, 3]
.then((res) => console.log(res));
// resolve๊ฐ€ 1์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise1 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("1"), Math.random() * 1000);
});
// reject๊ฐ€ Error์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise2 = new Promise((resolve, reject) => {
    setTimeout(() => reject("Error"), Math.random() * 1000);
});
// resolve๊ฐ€ 3์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise3 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("3"), Math.random() * 1000);
});
// ํ•œ๊ฐœ์˜ ํ”„๋กœ๋ฏธ์Šค๋ผ๋„ rejected ์ƒํƒœ๋ผ๋ฉด catch๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹คํ–‰์€ ์ข…๋ฃŒ๋œ๋‹ค.
Promise.all([promise1, promise2, promise3])
.then((res) => console.log(res))
// ๊ฒฐ๊ณผ : Error
.catch((err) => console.log(err));

๐Ÿงฉ Promise.all์˜ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ๋ฐฐ์—ด์— ์ธ์ž๋กœ ๋„˜๊ฒจ์ค„ ๋•Œ catch๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ์ „๋‹ฌ ๋ฐ›์œผ๋ฉด ํ”„๋กœ๋ฏธ์Šค๋Š” ์ž๋™์œผ๋กœ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ํŠน์„ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค.
// resolve๊ฐ€ 1์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise1 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("1"), Math.random() * 1000);
});
// reject๊ฐ€ Error์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise2 = new Promise((resolve, reject) => {
    setTimeout(() => reject("Error"), Math.random() * 1000);
});
// resolve๊ฐ€ 3์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise3 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("3"), Math.random() * 1000);
});
// catch๋ฅผ ์‚ฌ์šฉํ•ด์„œ rejected ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ fulfilled ์ƒํƒœ๋กœ ๋ฐ”๊ฟ”์„œ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ์‹
Promise.all([promise1, promise2.catch((err) => err), promise3])
// ๊ฒฐ๊ณผ : [ '1', 'Error', '3' ]
.then((res) => console.log(res))
// catch๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
.catch((err) => console.log(err));

๐Ÿ“‹ Promise.allSettled

  • ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ์˜ ๊ฐ’์„ ๋ชจ์•„์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • rejected ์ƒํƒœ์˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋งŒ๋‚˜๋„ ์ •์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
// resolve๊ฐ€ 1์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise1 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("1"), Math.random() * 1000);
});
// reject๊ฐ€ Error์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise2 = new Promise((resolve, reject) => {
    setTimeout(() => reject("Error"), Math.random() * 1000);
});
// resolve๊ฐ€ 3์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise3 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("3"), Math.random() * 1000);
});

Promise.allSettled([promise1, promise2, promise3])
/*
๊ฒฐ๊ณผ : 
[
  { status: 'fulfilled', value: '1' },
  { status: 'rejected', reason: 'Error' },
  { status: 'fulfilled', value: '3' }
]
*/
.then((res) => console.log(res));

๐Ÿ“‹ Promise.race

  • ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ  ๊ฐ€์žฅ ๋จผ์ € fulfilled ์ƒํƒœ์˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ์ค‘ rejected์™€ fulfilled ์ƒํƒœ๊ฐ€ ๋™์‹œ์— ์กด์žฌํ•˜๋ฉด ๋จผ์ € ์‹คํ–‰์ด ๋๋‚œ ์ƒํƒœ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
// resolve๊ฐ€ 1์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise1 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("1"), Math.random() * 1000);
});
// resolve๊ฐ€ 2์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise2 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("2"), Math.random() * 1000);
});
// resolve๊ฐ€ 3์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise3 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("3"), Math.random() * 1000);
});
// race ์‹œ์ž‘
Promise.race([promise1, promise2, promise3])
// ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ œ์ผ ๋นจ๋ฆฌ ์ข…๋ฃŒ๋œ fulfilled ๊ฐ’์ด ์ถœ๋ ฅ
.then((res) => console.log(res));
// resolve๊ฐ€ 1์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise1 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("1"), Math.random() * 1000);
});
// resolve๊ฐ€ 2์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise2 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("2"), Math.random() * 1000);
});
// rejected๊ฐ€ Error ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const promise3 = new Promise((resolve, reject) => {
    setTimeout(() => reject("Error"), Math.random() * 1000);
});
// race ์‹œ์ž‘
Promise.race([promise1, promise2, promise3])
// ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ œ์ผ ๋นจ๋ฆฌ ์ข…๋ฃŒ๋œ fulfilled, rejected๊ฐ€ ์‹คํ–‰
.then((res) => console.log("fulfilled", res))
.catch((err) => console.log("rejected", err));

๐Ÿ’ก Promise.race ํ”„๋กœํผํ‹ฐ๋Š” ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๊ณ  ๋นจ๋ฆฌ ์‹คํ–‰์ด ์™„๋ฃŒ๋œ ํ”„๋กœ๋ฏธ์Šค ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์„ ๋งŽ์ด ํ•˜์ง€๋Š” ์•Š์„ ๊ฒƒ ๊ฐ™๋‹ค.

profile
JS ์ฝ”๋ฆฐ์ด

0๊ฐœ์˜ ๋Œ“๊ธ€