TIL/JavaScript

๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋ž€? ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฐ์ฒด Promise๋ž€?

Edlin 2022. 7. 10. 21:10

1. ๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

๋™๊ธฐ๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฉฐ, ๋น„๋™๊ธฐ๋Š” ํ•œ๊บผ๋ฒˆ์— ๋งŽ์€ ์ผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ œ ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
๋‹ค์Œ ๊ทธ๋ฆผ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ, ๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” CPU๊ฐ€ Idle ์ƒํƒœ๊ฐ€ ๋˜๋ฉด์„œ ์ž์›์„ ๋‚ญ๋น„ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” CPU๊ฐ€ Idle์ƒํƒœ์— ๋น ์ง€์ง€ ์•Š๊ฒŒ ํ•จ์œผ๋กœ์จ ์ž์› ๋‚ญ๋น„๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

  • ๋™๊ธฐ:
    • ์ˆœ์ฐจ์ ์œผ๋กœ ์ผ์„ ์ฒ˜๋ฆฌ
    • ํ˜ธ์ถœ๋ถ€์—์„œ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ๋ฆฌํ„ด๋˜์–ด์•ผ ๋‹ค์Œ ์ผ์„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ


  • ๋น„๋™๊ธฐ:
    • ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ผ์„ ์ฒ˜๋ฆฌ
    • ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ž‘์—… ์ฒ˜๋ฆฌ
    • ํ˜ธ์ถœ๋ถ€์˜ ์‹คํ–‰๊ฒฐ๊ณผ๊ฐ€ ๋ฆฌํ„ด๋˜์ง€ ์•Š์•„๋„ ๋‹ค์Œ ์ผ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ


โœ” ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด Blocking๊ณผ Non-blocking์ด๋ž€ ์šฉ์–ด๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ธ”๋กœํ‚น์„ ๋™๊ธฐ์ , ๋…ผ๋ธ”๋กœํ‚น์„ ๋น„๋™๊ธฐ์ ์ด๋ผ๊ณ  ์˜คํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์–ด๊ถŒ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋А๋ƒ์— ๋”ฐ๋ผ Blocking๊ณผ Non-blocking์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๋งŒ ์œ ๋…ํ•œ ๋’ค, ์ด๋Š” ๋‹ค๋ฅธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ํ•˜๋‚˜์˜ ์ฃผ์ œ๋กœ ๋‹ค๋ฃจ์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


2. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ - ์ฝœ๋ฐฑ ํ•จ์ˆ˜

JavaScript์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋จผ์ € ์ดํ•ดํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋ฐฉ์‹ ์ค‘ Promise์™€ async-await์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ์ธ๋ฐ ์ด๋•Œ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๊ฐœ๋…์ด ์ž˜ ์žกํ˜€์žˆ์ง€ ์•Š๋‹ค๋ฉด ๋‘ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1) ์ฝœ๋ฐฑํ•จ์ˆ˜

  • ๋‚˜์ค‘์— ํ˜ธ์ถœ๋  ํ•จ์ˆ˜
  • ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์‹œ์ ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์‹œ์Šคํ…œ์ด ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜
const greeting = (name, callback) => {
    console.log(`Hello! ${name}`);
    callback();
}

const callback_function = () => {
    console.log("์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
}

// ์ธ์ž๊ฐ’์œผ๋กœ Edlin์„ ์ฃผ๊ณ  greeting ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, callback_function ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์ค˜.
greeting("Edlin", callback_function);

// Hello! Edlin
// ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
const greeting = (name, callback) => {
    console.log(`Hello! ${name}`);
    callback();   
}

// ์ธ์ž๊ฐ’์œผ๋กœ Edlin์„ ์ฃผ๊ณ  greeting ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, ์ต๋ช…ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์ค˜.
greeting("Edlin", function() {
    console.log("์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
});

// Hello! Edlin
// ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

2) ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์—์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋ƒˆ์„ ๋•Œ ์–ธ์ œ ์‘๋‹ต์ด ์˜ฌ์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋–ค ์‹œ์ ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ

3) ๋‚ด์žฅ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ setTimeout(function() {...}, miliseconds)

  • ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ด…์‹œ๋‹ค. ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
function greeting(country) {
  let result;

  setTimeout(function () {
    console.log("1์ดˆ ํ›„ ์‹คํ–‰");
    if (country === "Korea") result = "์•ˆ๋…•?";
    else if (country === "America") result = "Hello";
  }, 1000);
  return result;
}

const result = greeting("Korea");
console.log("ํ•œ๊ตญ์–ด ์ธ์‚ฌ: ", result);

<์˜ˆ์ƒ ๊ฒฐ๊ณผ>

1์ดˆ ํ›„ ์‹คํ–‰
ํ•œ๊ตญ์–ด ์ธ์‚ฌ: ์•ˆ๋…•?

<์‹ค์ œ ๊ฒฐ๊ณผ>

  • setTimeout()์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋กœ ๋™๊ธฐ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ˆœ์ฐจ์  ์‹คํ–‰์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „ ๋‹ค์Œ ๋ผ์ธ์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงก ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ line by line์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์œ ์˜ํ•˜์„ธ์š”!


  • ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ด…์‹œ๋‹ค. ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค.
function greeting(country, callback) {
  let result;

  setTimeout(function () {
    console.log("1์ดˆ ํ›„ ์‹คํ–‰");
    if (country === "Korea") result = "์•ˆ๋…•?";
    else if (country === "America") result = "Hello";
    callback(result);
  }, 1000);
}

greeting("Korea", function (result) {
  console.log("ํ•œ๊ตญ์–ด ์ธ์‚ฌ: ", result);
});


3. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฐ์ฒด Promise

  • ES6 ์ „, ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ค‘์ฒฉํ•˜์—ฌ ์—ฐ์‡„์ ์œผ๋กœ ํ˜ธ์ถœ(์ฝœ๋ฐฑ ์ง€์˜ฅ) ํ•˜์˜€์Šต๋‹ˆ๋‹ค. 
  • ES6 ํ›„, Promise๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜์˜€์Šต๋‹ˆ๋‹ค. 
Promise์˜ ์‚ฌ์ „์  ์˜๋ฏธ:... ์ผ ๊ฒƒ ๊ฐ™๋‹ค,... ์˜ ์กฐ์ง์„ ๋ณด์ด๋‹ค.
" An indication of future success or improvement "

1) Promise ๋ž€?

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

2) Promise.all(iterable)

  • ์ฃผ์–ด์ง„ ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ดํ–‰ ํ˜น์€ ํ•œ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๊ฑฐ๋ถ€๋  ๋•Œ ๋Œ€๊ธฐํ•˜๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ๋ฏธ์Šค ๋ฐ˜ํ™˜
  • iterable: ์ดํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ๊ฐ€์ง„ ๋ฐฐ์—ด
  • values: ์ดํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ชจ๋‘ ์ดํ–‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด(์„ฑ๊ณต), ๊ฐ๊ฐ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋ฐฐ์—ด
  • ์ดํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ•  ๊ฒฝ์šฐ, ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํ”„๋กœ๋ฏธ์Šค ์ค‘ ๊ฑฐ๋ถ€๋œ ์ฒซ ํ”„๋กœ๋ฏธ์Šค์˜ ์‚ฌ์œ ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ
// Promise.all() ์˜ˆ์ œ

const promise1 = Promise.resolve(5);
const promise2 = 30;
const promise3 = new Promise((resolve, reject) => {
// Promise()์˜ ์ธ์ž๊ฐ’์—๋Š” ์ฒ˜๋ฆฌํ•˜๊ณ ์žํ•˜๋Š” ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
  setTimeout(resolve, 100, "hello");
}); 

// values: ๊ฐ Promise ์„ฑ๊ณต ์‹œ ๊ฐ€์ง€๋Š” ๊ฐ’ (๋ฐฐ์—ด)
Promise.all([promise1, promise2, promise3]).then((values) => {
  console.log(values); // (3) [3, 30, 'hello']
});

// iterable ๊ฐ์ฒด : Promise {<state>: "fulfilled", <value>: Array[3]}
let iterable_value = Promise.all([1, 2, 3]); 

// ์‹คํŒจ ์‹œ iterable ๊ฐ์ฒด : Promise{<state>: "rejected", <reason>: 555}
let itrable_value2 = Promise.all([1, 2, 3, Promise.reject(555)]);

3) Promise.allSettled(iterable)

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

const promise1 = Promise.resolve(5);
const promise2 = 30;

Promise.allSettled([promise1, promise2]).then((results) => {
  results.forEach((result) => console.log(result));
});

// {status: 'fulfilled', value: 5}
// {status: 'fulfilled', value: 30}

4) Promise.race(iterable)

  • iterable ์•ˆ์— ์žˆ๋Š” ํ”„๋กœ๋ฏธ์Šค ์ค‘์— ๊ฐ€์žฅ ๋จผ์ € ์™„๋ฃŒ๋œ ๊ฒƒ์˜ ๊ฒฐ๊ด๊ฐ’์œผ๋กœ ๊ทธ๋Œ€๋กœ ์ดํ–‰ ํ˜น์€ ๊ฑฐ๋ถ€ 
// Promise.race() ์˜ˆ์ œ

const promise1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 1, "called before promise2");
});
const promise2 = 30;

Promise.race([promise1, promise2]).then((result) => {
  console.log(result); // 30
});

// promise1๊ณผ promise2 ๋‘˜ ๋‹ค ์‹คํ–‰๋˜์ง€๋งŒ, promise2๊ฐ€ ๋” ๋นจ๋ž๋‹ค.

5) Promise.resolve()

// Promise.resolve()

Promise.resolve(3).then((value) => {
  console.log(value); // 3
});

6) Promise.reject(reason)

  • reason type: String
// Promise.reject(reason)

Promise.reject("error")
  .then()
  .catch((value) => {
    console.log(value);
  });

4. ์‚ฌ์šฉ๋ฒ•

  • Promise๋Š” ํ•จ์ˆ˜์— ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹ , ์ฝœ๋ฐฑ์„ ์ฒจ๋ถ€ํ•˜๋Š” ๋ฐฉ์‹์˜ ๊ฐ์ฒด
    • ์œ„ ๋ฐ‘์ค„์€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ๋ฐฑ๋ฌธ์˜๋ถˆ์—ฌ์ผํƒ€! ์ฝ”๋“œ๋กœ ์ดํ•ดํ•ด ๋ด…์‹œ๋‹ค.
    • ๋‹ค์Œ ์˜ˆ์ œ๋Š” mdn web docs๋ฅผ ์ฐธ๊ณ ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
function successCallback(result) {
    console.log(result);
}

function failureCallback(error) {
    console.log(error);
}

// createAsync: ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ Promise ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜
// ์„ฑ๊ณต ์‹œ successCallback ์ฒจ๋ถ€ (์ฝœ๋ฐฑ ์ง์ ‘ ์„ ์–ธ X)
// ์‹คํŒจ ์‹œ failureCallback ์ฒจ๋ถ€ (์ฝœ๋ฐฑ ์ง์ ‘ ์„ ์–ธ X)
createAsync(information_parameter).then(successCallback, failureCallback);

 

  • ์•ž์„œ ์„ค๋ช…ํ–ˆ๋˜ Callback ํ•จ์ˆ˜์˜ ์˜ˆ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค. ์ธ์ž๊ฐ’๊ณผ ๋ณ„๊ฐœ๋กœ ์ˆ˜ํ–‰ํ•  ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Promise ๊ฐ์ฒด๋Š” callback์„ ์ฒจ๋ถ€ํ•˜๋Š” ๋ฐฉ์‹์˜ ๊ฐ์ฒด์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
function greeting(country, callback) {
  let result;

  setTimeout(function () {
    console.log("1์ดˆ ํ›„ ์‹คํ–‰");
    if (country === "Korea") result = "์•ˆ๋…•?";
    else if (country === "America") result = "Hello";
    callback(result);
  }, 1000);
}

greeting("Korea", function (result) {
  console.log("ํ•œ๊ตญ์–ด ์ธ์‚ฌ: ", result);
});

1) ๋ณด์žฅ

  • ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์ฝœ ์Šคํƒ์„ ์™„๋ฃŒํ•˜๊ธฐ ์ด์ „์—๋Š” ์ ˆ๋Œ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • โœจ then์„ ์—ฌ๋Ÿฌ๋ฒˆ ์ถ”๊ฐ€ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. → chaining

2) Chaining

  • ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰ํ•˜๊ณ ์ž ํ•  ๋•Œ Promise Chain์„ ์ด์šฉํ•  ๊ฒฝ์šฐ ์ฝœ๋ฐฑ์ง€์˜ฅ์— ๋น ์ง€์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • then() ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝœ๋ฐฑ ์ง€์˜ฅ์˜ ์˜ˆ
firstThing(function(result) {
    secondThing(result, function(result2){
        thirdThing(result2, function(result3){
            console.log(result3);
        }, failureCallback);
    }, failureCallback);
}, failureCallback);
  • ES6  ์ดํ›„ Promise ๊ฐ์ฒด ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์„ ํ•œ ์˜ˆ
// ์ถ•์•ฝํ•œ ์˜ˆ
firstThing().then(function(result){
    return secondThing(result);
}).then(function(result2){
    return thirdThing(result2);
}).then(function(result3){
    console.log(result3);
}).catch(failureCallback);

// ์ถ•์•ฝํ•˜์ง€ ์•Š์€ ์˜ˆ
firstThing().then((result) => secondThing(result))
            .then((result2) => thirdThing(result2))
            .then((result3) => {
                console.log(result3);
            })
            .catch(failureCallback);
  • ํ•œ chaining ์ž‘์—…์ด ์‹คํŒจํ•˜๋”๋ผ๋„ ์—ฐ์†ํ•ด์„œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
new Promise((resolve, reject) => {
  console.log("Initial");
  resolve();
})
  .then(() => {
    throw new Error("Something failed"); // error ๋ฐœ์ƒ - catch ์ˆ˜ํ–‰

    console.log("Do this");
  })
  .catch(() => {
    console.log("Do that");
  })
  .then(() => {
    console.log("Do this, whatever happened before");
  });


3) ์ •๋ฆฌ

  • ์ฝœ๋ฐฑํ•จ์ˆ˜์—์„œ๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ, ์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ๊ฐ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. (์œ„ ์˜ˆ์ œ์—์„œ 3๋ฒˆ)
  • Promise ๊ฐ์ฒด ์‚ฌ์šฉ ์‹œ, ์—๋Ÿฌ์ฒ˜๋ฆฌ๋Š” 1๋ฒˆ์œผ๋กœ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
  • Chaining ๋Œ€์‹  async/await๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ง๊ด€์ ์ด์–ด์„œ ๋”์šฑ ์„ ํ˜ธ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
Promise์˜ ๋‚ด์šฉ์ด ๊ธธ์–ด์ง€๋Š” ๊ด€๊ณ„๋กœ, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜ async / await๋Š” ๋‹ค์Œ ๊ธ€์—์„œ ์ด์–ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
// Promise then์„ ์‚ฌ์šฉํ•œ Chaining
firstThing().then((result) => secondThing(result))
            .then((result2) => thirdThing(result2))
            .then((result3) => {
                console.log(result3);
            })
            .catch(failureCallback);
            
// try...catch๋ฅผ ์ด์šฉํ•œ Chaining
try{
    const result = firstThing();
    const result2 = secondThing(result);
    const result3 = thirdThing(result2);
    console.log(result3);
} catch(error) {
    failureCallback(error);
}

// async/await ๊ตฌ๋ฌธ์„ ์ด์šฉ
async function asyncFunction() {}
    try{
        const result = await firstThing();
        const result2 = await secondThing(result);
        const result3 = await thirdThing(result2);
        console.log(result3);
    } catch(error) {
        failureCallback(error);
    }
}

 

๋”๋ณด๊ธฐ

<์ฐธ๊ณ  ์‚ฌ์ดํŠธ>

https://www.hanumoka.net/2018/10/24/javascript-20181024-javascript-callback/

 

Javascript - ์ฝœ๋ฐฑํ•จ์ˆ˜(Callback function)์ด๋ž€?

๋“ค์–ด๊ฐ€๊ธฐCallback ํ•จ์ˆ˜๋ฅผ ๋ชจ๋ฅด์ง€๋Š” ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ์ž˜ ์•ˆ๋‹ค๊ณ  ๋งํ• ์ˆ˜๋„ ์—†๋‹ค.์š”์ฆ˜ Node, Vue ๋“ฑ์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ callback ํ•จ์ˆ˜์˜ ์ง„ํ™”ํ˜•์ธ Promise, async ๋“ฑ์„ ์ ‘ํ–ˆ๊ณ  ๊ณง ๋ฒฝ์— ๋ง‰ํ˜”๋‹ค.์ด ๊ธ€์„ ํ†ตํ•ด Javascript cal

www.hanumoka.net

https://www.daleseo.com/js-async-callback/

 

[์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ] ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ 1๋ถ€ - Callback

Engineering Blog by Dale Seo

www.daleseo.com

https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Using_promises

 

Using promises - JavaScript | MDN

Promise๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์ตœ์ข… ์™„๋ฃŒ ๋˜๋Š” ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ์—ฌ๋Ÿฌ๋ถ„์€ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ promise๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ promise๋ฅผ ๋งŒ๋“œ๋Š”์ง€ ์„ค๋ช…ํ•˜๊ธฐ์— ์•ž์„œ 

developer.mozilla.org

https://ko.javascript.info/async-await

 

async์™€ await

 

ko.javascript.info

 

๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋ ค ๋…ธ๋ ฅํ•˜์˜€๋Š”๋ฐ, ์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธ€์„ ์ฝ์œผ์‹œ๋‹ค ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.
๋‹ค์Œ ์ •๋ฆฌ๋ถ€ํ„ฐ๋Š” ์ •๋ฆฌ๋‚ด์šฉ์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด "...์Šต๋‹ˆ๋‹ค." ๋Œ€์‹  "...๋‹ค."๋กœ ๋ฌธ์žฅ์˜ ๋งˆ๋ฌด๋ฆฌ๋ฅผ ์ง“๊ฒ ์Šต๋‹ˆ๋‹ค.