2 ๋ถ„ ์†Œ์š”

JS์˜ ๋น„๋™๊ธฐ๐Ÿ

Promise

๐Ÿณ๏ธ Promise : JS์— ๋‚ด์žฅ๋œ Object๋กœ asyncํ•œ๊ฒƒ์„ ์ˆ˜ํ–‰ํ• ๋•Œ ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋Œ€์‹ ์— ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ ํ•จ์ˆ˜

1. Producer


const promise = new Promise((reslove, reject) => {
  resolve('junhyeok') //์„ฑ๊ณตํ–ˆ์„๋•Œ
  reject(new Error('๋ญ”๊ฐ€ ์ž˜์•ˆ๋์–ด!'))        //์‹คํŒจํ–ˆ์„๋•Œ
  console.log("asd");
});


์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด ๋ฐ”๋กœ 'asd'๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ์ฆ‰ Promise๋Š” ์ƒ์„ฑ๋˜๋Š” ์ˆœ๊ฐ„ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.


๊ทธ๋ ‡๊ธฐ์— Promise์˜ ์ƒ์„ฑํƒ€์ด๋ฐ์„ ์ž˜ ์กฐ์ ˆํ•˜์ž.


์ฃผ๋กœ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ๋ฌด๊ฑฐ์šด ์ผ๋“ค์„ Promise์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜์— ๋„ฃ์–ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ž.


2. Consumers : then, catch, finally


promise
  .then((success) => {
    console.log(success); // junhyeok
  })
  .catch((error) => {
    cosole.log(error);
  })
  .finally(() => {
    console.log("๋งˆ์ง€๋ง‰์— ๊ทธ๋ƒฅ ์‹คํ–‰์‹œ์ผœ๋ด„");
  });


then์€ ์„ฑ๊ณต, catch๋Š” ์‹คํŒจ, finally๋Š” ์„ฑ๊ณตํ•˜๋“  ์‹คํŒจํ•˜๋“  ๊ทธ๋ƒฅ ์‹คํ–‰์‹œํ‚ด.


const Abcd = new Promise((resolve, reject) => {
  resolve(1);
});

Abcd.then((success) => {
  //2
  success * 2;
})
  .then((success) => {
    //6
    success * 3;
  })
  .then((success) => {
    return new Promise((resolve, reject) => {
      //5
      resolve(success - 1);
    }).then((success) => {
      console.log(success); //5
    });
  });


then์˜ ์•ˆ์— Promise์ƒ์„ฑ๊ฐ€๋Šฅ



example

class UserStorage {
  //
  loginUser(id, pw) {
    return new Promise((resolve, reject) => {
      if (๋‚ด๊ฐ€์›ํ•˜๋Š”๊ฒŒ๋œ๋‹ค๋ฉด) {
        resolve(id);
      } else {
        reject(new Error("์‹คํŒจ..."));
      }
    });
  }

  getRoles(user) {
    return new Promise((resolve, reject) => {
      if (user === "abc") {
        resolve({ name: "abc", role: "์ดˆ์ฝœ๋ฆฟ" });
      } else {
        reject(new Error("์‹คํŒจ.."));
      }
    });
  }
}

UserStorage.loginUser(id, pw)
  .then((id) => {
    UserStorage.getRoles(id);
  })
  .then((user) => {
    console.log(`${user.name} , ${user.role} ์ž…๋‹ˆ๋‹ค.`);
  })
  .catch(console.log);


์š”์•ฝ : loginUser์— id์™€pw๋ฅผ ๋„ฃ๊ณ  ์กฐ๊ฑด๋ฌธ์— ์„ฑ๋ฆฝํ•˜๋ฉด ๊ทธ๊ฐ’์„ getRoles์— ๋„ฃ์–ด์ฃผ๊ณ  getRoles์˜ ์กฐ๊ฑด์ด ์„ฑ๋ฆฝํ•˜๋ฉด ์ถœ๋ ฅํ•œ๋‹ค.


async and await

๐Ÿณ๏ธ async and await : Promise๋ฅผ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด์ฃผ๋ฉฐ ์ข€ ๋” ๋™๊ธฐ์ ์œผ๋กœ ๋ณด์ด๊ฒŒ ํ•ด์ค€๋‹ค.

async

function Abcd() {
  return new Promise((resolve, reject) => {
    resolve("abc");
  });
}

//========================================================================

async function Abcd() {
  return "abc";
}


async๋ฅผ ํ•จ์ˆ˜ ์•ž์— ์“ฐ๋ฉด ์ฝ”๋“œ๋ธ”๋Ÿญ์ด Promise ๊ธฐ๋Šฅ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.



await

async function Abcd() {
  const a = await delay(3000);
  return a;
}


async๋ฅผ ์จ์•ผ์ง€๋งŒ await์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.(3์ดˆ๊ฐ„ ๋Œ€๊ธฐ ํ›„ ๋ณ€์ˆ˜a์˜ ๊ฐ’ ์ถœ๋ ฅ)


async function Abcd() {
  try {
    const a = await getA();
    const b = await getB();
  } catch (error) {
    console.log;
  }

  return `${a} + ${b}`;
}


๋™๊ธฐ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. then ์ฒ˜๋ฆฌ๋ฅผ await์œผ๋กœ ๋Œ€์ฒด


๋ณ‘๋ ฌ์  ์ฒ˜๋ฆฌ

function Abcd() {
  return Promise.all([getA(), getB()]).then((๋ฐฐ์—ด) => console.log(๋ฐฐ์—ด));
}

//==================================================================================

function Abcd() {
  return Promise.race([getA(), getB()]);
}

Abcd().then((๋‘๊ฐœ์ค‘๋น ๋ฅธ๊ฒƒ) => console.log(๋‘๊ฐœ์ค‘๋น ๋ฅธ๊ฒƒ)); // then(console.log)


all์ด๋ž€ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ฐฐ์—ด์— ๋‹ด์„ ์ˆ˜ ์žˆ๊ณ  race๋ฅผ ํ†ตํ•ด ๊ฐ€์žฅ๋นจ๋ฆฌ ๋๋‚˜๋Š” ๊ฐ’๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.



์š”์•ฝ : async await์€ ๋™๊ธฐ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ์œผ๋กœ์จ ์ข€ ๋” ์ง๊ด€์ ์ด๋‹ค. Promise ์ฒด์ด๋‹์œผ๋กœ ์ž‘์„ฑ์„ ํ•œ๋‹ค๋ฉด ๋ณ€์ˆ˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๋ช…ํ™•ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์–ธ์ œ๋“ ์ง€ ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์ด ๋‹จ์ ์ด ๋  ์ˆ˜ ๋„ ์žˆ๋‹ค.


์—…๋ฐ์ดํŠธ: