[JS] Callback, Promise, Async/await

๋น„๋™๊ธฐ๋ž€?

ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์ž‘์—…๊ณผ๋Š” ๋ณ„๋„๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ

Callback์ด๋ž€?

๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜

๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋„˜๊ธฐ๋Š” ๊ธฐ๋ฒ•

Promise๋ž€?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…(setTimeout, API ์š”์ฒญ)์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด

  1. pending(๋Œ€๊ธฐ์ค‘(์ž‘์—…์ค‘))
  2. fulfilled(์„ฑ๊ณต)
  3. rejected(์‹คํŒจ)
const p = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("์„ฑ๊ณต!");
  }, 1000);
}).then(value => {
  console.log(value);
}).catch(err => {
  console.error(err);
}).finally(() => {
  console.log("๋ฌด์กฐ๊ฑด ์‹คํ–‰๋จ");
});

Async/await๋ž€?

  • Promise๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์•„๋‹ˆ๋‹ค.
  • function ์•ž์— async ๋ถ™์—ฌ์ฃผ๊ณ  ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ถ€๋ถ„ ์•ž์— awit๋งŒ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.
  • ์ฝ”๋“œ ์ž‘์„ฑ ๋ถ€๋ถ„์„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ฒŒ ํŽธํ•˜๊ฒŒ ๋ณด์ด๋Š” ๋ฌธ๋ฒ•๋งŒ ๋‹ค๋ฅด๊ฒŒ ํ•ด์ค„ ๋ฟ
  • async
    • ํ•จ์ˆ˜ ์•ž์— async ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์คŒ์œผ๋กœ์จ, ํ•จ์ˆ˜๋‚ด์—์„œ await๋ฅผ ์‚ฌ์šฉ
    • ES2022๋ถ€ํ„ฐ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„(ESM)์—์„œ๋Š” ํŒŒ์ผ ์ตœ์ƒ๋‹จ์—์„œ๋„ await์„ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉ
    • ํ•จ์ˆ˜ ๋ฆฌํ„ด๊ฐ’์€ Promse ๊ฐ์ฒด ⇒ ๋‹จ์ˆœํ•œ ๊ฐ’์ด์—ฌ๋„ fulfilled ์ƒํƒœ์˜ ๊ฐ์ฒด ๋ฐ˜ํ™˜
  • await
    • Promise ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋ ๋•Œ ๊นŒ์ง€ ์ฝ”๋“œ ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  wait

์ฝœ๋ฐฑ ์ง€์˜ฅ(Callback Hell) ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ค‘์ฒฉ๋˜์–ด ์ฝ”๋“œ์˜ ๊นŠ์ด๊ฐ€ ๊นŠ์–ด์ง€๋Š” ํ˜„์ƒ

  • ์ฝœ๋ฐฑ ์ง€์˜ฅ์€ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ฝœ๋ฐฑ ์•ˆ์— ๋˜ ์ฝœ๋ฐฑ์„ ๊ณ„์† ์ค‘์ฒฉํ•ด ์ž‘์„ฑํ•˜๋ฉด์„œ

์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๊นŠ์–ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๋ฌธ์ œ์ด๋‹ค.

  • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ์ ‘๊ทผ์„ ์‚ฌ์šฉํ•˜๋‹ค.
  1. Promise

๋น„๋™๊ธฐ ์ž‘์—…์˜ ์„ฑ๊ณต/์‹คํŒจ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด then() ์ฒด์ด๋‹์„ ํ†ตํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ž‘์„ฑ ๊ฐ€๋Šฅ

  1. async/await

Promise๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๊ฐ€๋Šฅ

  1. Promise.all

๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ์ž‘์—…์„ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ๊ตฌ์กฐ ๊ฐœ์„ 


Promise์™€ Callback์˜ ์ฐจ์ด

1. ๊ฒฐ๊ณผ๊ฐ’ ์‚ฌ์šฉ ๋ฒ”์œ„

callback์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝœ๋ฐฑ ๋ฐ–์—์„œ๋Š” ๊ฒฐ๊ณผ๊ฐ’์„ ์•Œ ์ˆ˜ ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— callback์•ˆ์—์„œ๋งŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

promise๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ’์ด promise ๊ฐ์ฒด์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— callback ๋ฐ–์—์„œ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

Callback

function async(callback) {
  var result;
    
  setTimeout(() => {
    result = callback("๊ฒฐ๊ณผ๊ฐ’"); // 1์ดˆ ๋’ค ์‹คํ–‰
  },1000);
    
  return result; // โ— setTimeout๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋จ
}

var b = async((res) => {
  return res;
})

console.log(b) // undefined

Promise ๊ฐ์ฒด์— ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ๋“  then ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

var p = new Promise((res, rej) => {
    setTimeout(() => {
      res("a")
    }, 1000)
    
})

var result = p.then(res => {
  return res;
})

console.log(result) // Promise {<fulfilled>: "a"}

result.then(res => {
    console.log(res); // "a"
})

2. ์ฝ”๋“œ ๊นŠ์ด ์ฐจ์ด

๋น„๋™๊ธฐ ๋กœ์ง์˜ ๊ฒฐ๊ณผ(1)๋ฅผ ๋ฐ›์•„์„œ ๋‹ค์Œ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์‹คํ–‰ํ•  ๋•Œ callback์€ ์ ์  ๊นŠ์–ด์ ธ์„œ ๊ฐ€๋…์„ฑ์ด ๋”์ฐ

Promise๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ฝ”๋“œ๊ฐ€ ๊นŠ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

Callback

function async(result, callback) {
  setTimeout(() => {
    callback(result, function (result) {
      console.log(result);
    });
  }, 1000);
}

async(0, function (res, callback) {
  callback(res)
  async(res + 1, function (res, callback) {
    callback(res)
    async(res + 1, function (res, callback) {
      callback(res)
    });
  });
});

// 0
// 1
// 2

Promise ๊ฐ์ฒด์— ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ๋“  then ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

function async(result) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(result);
      resolve(result);
    }, 1000)
  });
}

async(0).then(res => {
  return async(res + 1);
}).then(res => {
  return async(res + 1);
})

// 0
// 1
// 2

 

Promise์™€ Async/await ์ฐจ์ด

1. ์ฝ”๋“œ ๊นŠ์ด ์ฐจ์ด

Promise์„ ์‚ฌ์šฉํ•˜๋ฉด then์„ ์—ฐ์†์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ๋ณต์žก

async/await์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋™๊ธฐ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ์—๋Ÿฌ ์ฒ˜๋ฆฌ

Promise์„ ์‚ฌ์šฉํ•˜๋ฉด catch() ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ค‘๊ฐ„ ์ค‘๊ฐ„์— ๋ช…์‹œํ•จ์œผ๋กœ์จ ์—๋Ÿฌ๋ฅผ ๋ฐ›์•„์•ผ๋งŒ ํ•œ๋‹ค.

async/await์„ ์‚ฌ์šฉํ•˜๋ฉด try/catch๋ฌธ์„ ์”Œ์šฐ๋ฉด ๋œ๋‹ค.


๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

๊ณตํ†ต

function getApple(){
  return new Promise( (resolve, reject) => {
    setTimeout(() => resolve("apple"), 1000);
  })
}

function getBanana(){
  return new Promise( (resolve, reject) => {
    setTimeout(() => resolve("banana"), 1000);
  })
}

์ž˜๋ชป๋œ ์˜ˆ์‹œ

async function getFruites() {
  let a = await getApple(); // getApple() ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์š”์ฒญํ•˜๊ณ , ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋ ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ (1์ดˆ ์†Œ์š”)
  let b = await getBanana(); // getBanana() ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์š”์ฒญํ•˜๊ณ , ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋ ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ (1์ดˆ ์†Œ์š”)
  console.log(`${a} and ${b}`); // ์ด 2์ดˆ ์†Œ์š”
}

์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ

async function getFruites(){

  let getApplePromise = getApple(); // asyncํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ๋…ผ๋ธ”๋กํ‚น์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค. 
  let getBananaPromise = getBanana(); // asyncํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ๋…ผ๋ธ”๋กํ‚น์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค. 
  
  // ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ๊ฐ ๋ฐฑ๋‹จ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฑฐ์˜ ๋™์‹œ์— ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค.
  console.log(getApplePromise)
  console.log(getBananaPromise)
  
  let a = await getApplePromise; // ์œ„์—์„œ ๋ฐ›์€ ํ”„๋กœ๋ฏธ์Šค๊ฐ์ฒด ๊ฒฐ๊ณผ ๋ณ€์ˆ˜๋ฅผ await์„ ํ†ตํ•ด ๊บผ๋‚ธ๋‹ค.
  let b = await getBananaPromise; // ์œ„์—์„œ ๋ฐ›์€ ํ”„๋กœ๋ฏธ์Šค๊ฐ์ฒด ๊ฒฐ๊ณผ ๋ณ€์ˆ˜๋ฅผ await์„ ํ†ตํ•ด ๊บผ๋‚ธ๋‹ค.
  
  console.log(`${a} and ${b}`); // ๋ณธ๋ž˜๋ผ๋ฉด 1์ดˆ+1์ดˆ ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š”๋ฐ, ์œ„์—์„œ 1์ดˆ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ”๋กœ ์—ฐ์†์œผ๋กœ ๋น„๋™๊ธฐ๋กœ ๋ถˆ๋ ค์™”๊ธฐ ๋•Œ๋ฌธ์—, ๋Œ€์ถฉ 1.01์ดˆ๋งŒ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์ฒ˜๋ฆฌ๋œ๋‹ค.
})

'โ˜€๏ธFront-End > ๐Ÿ“—JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JS] ์ฟ ํ‚ค/ ์„ธ์…˜/ JWT / Access Token, Refresh Token ์ธ์ฆ ๋ฐฉ์‹  (0) 2026.01.06
[JS] OffscreenCanvas  (0) 2024.12.26
[JS] ResizeObserver  (0) 2024.12.09
[JS] Web Worker  (0) 2024.11.18
[JS] var, let, const  (0) 2024.02.22