240809 promise, async, await

์‹ ํ•œ๋ณ„ยท2024๋…„ 8์›” 9์ผ

๐Ÿ’ช ๋งค์ผ ๊ธฐ๋ก

๋ชฉ๋ก ๋ณด๊ธฐ
46/97

Async/Await ๊ธฐ๋ณธ

๐Ÿ’ก async, await ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ํ˜„๋Œ€์  ํŒจํ„ด์ด๋‹ค.
๊ธฐ์กด์˜ ๋ณต์žกํ•œ ํ”„๋กœ๋ฏธ์Šค ์ฒด์ธ์„ ๊ฐ„๊ฒฐํ•˜๊ณ  ๋™๊ธฐ์ ์ธ ํ๋ฆ„์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.

(1) Promise ๐Ÿ˜ฉ

Promise๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์ตœ์ข… ์™„๋ฃŒ ๋˜๋Š” ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด
๋น„๋™๊ธฐ ์ž‘์—…์ด ์ˆ˜ํ–‰๋  ๋•Œ ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์„ ๋‚˜์ค‘์— ๋ฐ›๊ธฐ ์œ„ํ•œ ์•ฝ์†์œผ๋กœ ์‚ฌ์šฉ
์ฃผ๋กœ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์•„์˜ค๋Š” HTTP ์š”์ฒญ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ
ํŒŒ์ผ ์‹œ์Šคํ…œ ์ž‘์—…์„ ๋น„๋กฏํ•œ ๋‹ค์–‘ํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์— ํ™œ์šฉ

Promise ๋Š” ์„ธ๊ฐ€์ง€ ์ƒํƒœ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ€์ง„๋‹ค.

  • Pending (๋Œ€๊ธฐ์ค‘) : ์ดˆ๊ธฐ ์ƒํƒœ๋กœ, ์•„์ง ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ๊ฐ€ ๊ฒฐ์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ
  • Fullfilled (์ดํ–‰๋จ) : ์—ฐ์‚ฐ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์–ด ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•œ ์ƒํƒœ
  • Rejected (๊ฑฐ๋ถ€๋จ) : ์—ฐ์‚ฐ์ด ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์ƒํƒœ

Promise ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ .then(),.catch() ๊ทธ๋ฆฌ๊ณ  .finally() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์—ฐ์†์ ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
๐Ÿ‘‰ ์ฝœ๋ฐฑ ์ง€์˜ฅ(Callback hell)์„ ํ”ผํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค.


const myPromise = new Promise(function(resolve, reject) {
  // ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ 
  if (/* ์ž‘์—… ์„ฑ๊ณต */) {
    resolve('Success!');
  } else {
    reject('Error!');
  }
});

myPromise.then(function(value) {
  // ์„ฑ๊ณต(resolve)ํ•œ ๊ฒฝ์šฐ ์ˆ˜ํ–‰
  console.log(value);  // 'Success!'
}).catch(function(error) {
  // ์‹คํŒจ(reject)ํ•œ ๊ฒฝ์šฐ ์ˆ˜ํ–‰
  console.error(error);  // 'Error!'
});

(2) Async ํ•จ์ˆ˜์˜ ์ •์˜

1. Async ํ•จ์ˆ˜ ์ •์˜ ๋ฐฉ๋ฒ•

async ํ•จ์ˆ˜๋Š” async ํ‚ค์›Œ๋“œ๋ฅผ ํ•จ์ˆ˜ ์„ ์–ธ ์•ž์— ๋ถ™์—ฌ ์ •์˜.
๐ŸŽ ์ด ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

async function fetchData() {
  return 'Data loaded';
}

// ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์•„์š”.
// async function fetchData() {
// 	return Promise.resolve('Data loaded');
// }

fetchData().then(console.log); // 'Data loaded'

(3) Await

1. await ์‚ฌ์šฉ์˜ ์ด์ 

await ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๋ฏธ์Šค์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ์ผ์‹œ์ ์œผ๋กœ ์ค‘๋‹จํ•˜๊ณ , ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด ์ž๋™์œผ๋กœ ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ์žฌ๊ฐœ

  • ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ๋™๊ธฐ์  ํ‘œํ˜„์ด ๊ฐ€๋Šฅ
    โˆด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
async function fetchData() {
  try {
    const data = await fetch('https://api.example.com/data');
    const json = await data.json();
    console.log(json);
  } catch (error) {
    console.error("Data loading failed", error);
  }
}

fetchData();

2. await ๋ฏธ์‚ฌ์šฉ์˜ ๋ฌธ์ œ

await ์‚ฌ์šฉ ์—†์ด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด .then()๊ณผ .catch() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๋ฏธ์Šค ์ฒด์ธ์„ ๊ตฌ์„ฑํ•ด์•ผํ•œ๋‹ค.
๋ฐ˜๋ณต์ ์ธ depth ๋งˆ๋‹ค ๋ณต์žกํ•œ ์ฒด์ธ์„ ๋งŒ๋“ฆ
โˆด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ์ €ํ•˜ / ์œ ์ง€๋ณด์ˆ˜ ๋‚œ์ด๋„ ์ƒ์Šน

function fetchData() {
  return fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error("Data loading failed", error));
}

fetchData();

๋น„๋™๊ธฐ๊ฐ€ ๋‚˜๋ฅผ ๊ดด๋กญํžŒ๋‹ค.
์—ญ์‹œ ๋™๊ธฐ์‚ฌ๋ž‘ ๋‚˜๋ผ์‚ฌ๋ž‘ ๐Ÿ˜ฟ

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