Lecture/์ฝ”๋“œ์Šคํ…Œ์ด์ธ 

[SEB FE] section 2 unit 3 - [JS /Node] ๋น„๋™๊ธฐ

Dong _ hwa 2023. 5. 17. 18:43

Underbar

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐฐ์—ด ๋‚ด์žฅ ๋ฉ”์„œ๋“œ(forEach, map, filter, reduce ๋“ฑ)์˜ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•œ๋‹ค.
  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ „๋‹ฌ์„ ์ž์œ ๋กญ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.



bareMinimum

 

// _.identity๋Š” ์ „๋‹ฌ์ธ์ž(argument)๊ฐ€ ๋ฌด์—‡์ด๋“ , ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// ์ด ํ•จ์ˆ˜๋Š” underbar์˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์žฌ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
_.identity = function (val) {
  return val
};

 

// _.take๋Š” ๋ฐฐ์—ด์˜ ์ฒ˜์Œ n๊ฐœ์˜ element๋ฅผ ๋‹ด์€ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// n์ด undefined์ด๊ฑฐ๋‚˜ ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ, ๋นˆ ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// n์ด ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ, ์ „์ฒด ๋ฐฐ์—ด์„ shallow copyํ•œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
_.take = function (arr, n) {
  let result = [];
  if (n === undefined || n <= 0) return [];
  if (n > arr.length) return arr
  if (n <= arr.length) {
    for (let i = 0; i < n; i++) {  // arr.length -1 ์„ ํ•ด๋„ ํ†ต๊ณผ.. ์™œ?
      result.push(arr[i])
    }
  } return  result
};

 

// _.drop๋Š” _.take์™€๋Š” ๋ฐ˜๋Œ€๋กœ, ์ฒ˜์Œ n๊ฐœ์˜ element๋ฅผ ์ œ์™ธํ•œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// n์ด undefined์ด๊ฑฐ๋‚˜ ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ, ์ „์ฒด ๋ฐฐ์—ด์„ shallow copyํ•œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// n์ด ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ, ๋นˆ ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
_.drop = function (arr, n) {
  let result = [];
  if (n === undefined || n <= 0) return arr
  if (n > arr.length) return [];
  if (n <= arr.length) {
    result.push(arr[arr.length-1])          // ์™„๋ฒฝํžˆ ์ดํ•ด๋Š” ์•ˆ๊ฐ
  }
  return result
};

 

// _.last๋Š” ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ n๊ฐœ์˜ element๋ฅผ ๋‹ด์€ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// n์ด undefined์ด๊ฑฐ๋‚˜ ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ, ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋งŒ์„ ๋‹ด์€ ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// n์ด ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ, ์ „์ฒด ๋ฐฐ์—ด์„ shallow copyํ•œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// _.take์™€ _.drop ์ค‘ ์ผ๋ถ€ ๋˜๋Š” ์ „๋ถ€๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
_.last = function (arr, n) {
  let result = [];
  if (n === 0) return []
  if (n === undefined || n < 0) return [arr.pop()]
  if (n > arr.length) return arr
  if (n <= arr.length) {
    result.push(arr[arr.length-n], arr.length)
  }
return result
};

 

// _.each๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์–ด๋–ค ๊ฐ’์„ ๋ฆฌํ„ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
_.each = function (collection, iteratee) {
    if (Array.isArray(collection)) {
      for (let i = 0; i < collection.length; i++) {
        iteratee(collection[i], i, collection)
      }
    } else {
      for (let obj in collection) {     //of ์ผ๋‹ค๊ฐ€ ํ‹€๋ฆผ
        iteratee(collection[obj], obj, collection)
      }
    }
};

 

// _.indexOf๋Š” target์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์ด arr์˜ ์š”์†Œ์ธ ๊ฒฝ์šฐ, ๋ฐฐ์—ด์—์„œ์˜ ์œ„์น˜(index)๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ, -1์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// target์ด ์ค‘๋ณตํ•ด์„œ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฐ€์žฅ ๋‚ฎ์€ index๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
_.indexOf = function (arr, target) {
  // ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด, ์ˆœํšŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜(iteration algorithm)์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  // ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด์ง€๋งŒ, ์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” ์ด๋ฏธ ๊ตฌํ˜„ํ•œ _.each ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  // ์•„๋ž˜ _.indexOf์˜ ๊ตฌํ˜„์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  let result = -1;

  _.each(arr, function (item, index) {
    if (item === target && result === -1) {
      result = index;
    }
  });

  return result;
};

 

// _.filter๋Š” test ํ•จ์ˆ˜๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋‹ด์€ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// test(element)์˜ ๊ฒฐ๊ณผ(return ๊ฐ’)๊ฐ€ truthy์ผ ๊ฒฝ์šฐ, ํ†ต๊ณผ์ž…๋‹ˆ๋‹ค.
// test ํ•จ์ˆ˜๋Š” ๊ฐ ์š”์†Œ์— ๋ฐ˜๋ณต ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
_.filter = function (arr, test) {
    let result = [];
    _.each (arr, function (el) {
        if (test(el)) {
          result.push(el)
        }
    })
  return result
};

 

// _.reject๋Š” _.filter์™€ ์ •๋ฐ˜๋Œ€๋กœ test ํ•จ์ˆ˜๋ฅผ ํ†ต๊ณผํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋‹ด์€ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
_.reject = function (arr, test) {
    let result = [];
    _.each (arr, function (el) {
      if (!test(el)) {
          result.push((el))
      }
    })
  return result
  // TIP: ์œ„์—์„œ ๊ตฌํ˜„ํ•œ `filter` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ `reject` ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด์„ธ์š”.
};

 

// _.uniq๋Š” ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// ์ค‘๋ณต ์—ฌ๋ถ€์˜ ํŒ๋‹จ์€ ์—„๊ฒฉํ•œ ๋™์น˜ ์—ฐ์‚ฐ(strict equality, ===)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
// ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ฐฐ์—ด์˜ ์š”์†Œ๋Š” ๋ชจ๋‘ primitive value๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
_.uniq = function (arr) {
    let result = [];
    _.each (arr, function (el) {
        if(_.indexOf(result, el) === -1 ) {
          result.push(el)
        }
    })
  return result
};

 

// _.map์€ iteratee(๋ฐ˜๋ณต๋˜๋Š” ์ž‘์—…)๋ฅผ ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ์ ์šฉ(apply)ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์€ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// ํ•จ์ˆ˜์˜ ์ด๋ฆ„์—์„œ ๋“œ๋Ÿฌ๋‚˜๋“ฏ์ด _.map์€ ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋ฅผ ๋‹ค๋ฅธ ๊ฒƒ(iteratee์˜ ๊ฒฐ๊ณผ)์œผ๋กœ ๋งคํ•‘(mapping)ํ•ฉ๋‹ˆ๋‹ค.
_.map = function (arr, iteratee) {
    // TODO: ์—ฌ๊ธฐ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
    // _.map ํ•จ์ˆ˜๋Š” ๋งค์šฐ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    // _.each ํ•จ์ˆ˜์™€ ๋น„์Šทํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ, ๊ฐ ์š”์†Œ์— iteratee๋ฅผ ์ ์šฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
    let newArr = [];
    _.each(arr, function (el) {
        // iterateee
        newArr.push(iteratee(el));
    });
    return newArr;
};

 

// _.pluck์€
//  1. ๊ฐ์ฒด ๋˜๋Š” ๋ฐฐ์—ด์„ ์š”์†Œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด๊ณผ ๊ฐ ์š”์†Œ์—์„œ ์ฐพ๊ณ ์ž ํ•˜๋Š” key ๋˜๋Š” index๋ฅผ ์ž…๋ ฅ๋ฐ›์•„
//  2. ๊ฐ ์š”์†Œ์˜ ํ•ด๋‹น ๊ฐ’ ๋˜๋Š” ์š”์†Œ๋งŒ์„ ์ถ”์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ์ €์žฅํ•˜๊ณ ,
//  3. ์ตœ์ข…์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ ๊ฐœ์ธ์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ ๊ฐ์ฒด๋ฅผ ์š”์†Œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด์„ ํ†ตํ•ด์„œ, ๋ชจ๋“  ๊ฐœ์ธ์˜ ๋‚˜์ด๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ณ„๋„์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
// ์ตœ์ข…์ ์œผ๋กœ ๋ฆฌํ„ด๋˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ฐฐ์—ด์˜ ๊ธธ์ด์™€ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
// ๋”ฐ๋ผ์„œ ์ฐพ๊ณ ์ž ํ•˜๋Š” key ๋˜๋Š” index๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ์š”์†Œ์˜ ๊ฒฝ์šฐ, ์ถ”์ถœ ๊ฒฐ๊ณผ๋Š” undefined ์ž…๋‹ˆ๋‹ค.
_.pluck = function (arr, keyOrIdx) {
    // _.pluck์„ _.each๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    // let result = [];
    // _.each(arr, function (item) {
    //   result.push(item[keyOrIdx]);
    // });
    // return result;
    // _.pluck์€ _.map์„ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
     return _.map (arr, function (item) {
        return item[keyOrIdx]
    })
};

 

//reduce ์„ค๋ช… ์ƒ๋žต
_.reduce = function (arr, iteratee, initVal) {
      // TODO: ์—ฌ๊ธฐ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
    // ์ผ๋‹จ ๋ˆ„์  ๊ฐ’์„ ๊ตฌํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ initVal๋ฅผ ๋ณ€์ˆ˜ result์— ํ• ๋‹น
    // arr์š”์†Œ๋ฅผ ๋Œ๋ฉด์„œ iterateeํ•จ์ˆ˜์— ๋”ฐ๋ผ result์— ์ค‘์ฒฉ
    // initVal๊ฐ€ undefined ๊ฑฐ๋‚˜ 0 ์ผ๋•Œ
    let result = initVal;
    _.each(arr, function (ele, idx, collection) {
        // ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •๋˜์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ
        if(initVal === undefined && idx === 0) { /// ์™œ idx === 0 ์ด ์žˆ์–ด์•ผ ํ•˜๋Š”๊ฐ€??
            result = ele;
        }
        else {
            result = iteratee(result, ele, idx, collection);
        }
    })
    return result;
};

๋น„๋™๊ธฐ

  • client : '์„œ๋ฒ„๋กœ ์ ‘์†ํ•˜๋Š” ์ปดํ“จํ„ฐ' (๋ณดํ†ต ์šฐ๋ฆฌ์˜ ์ปดํ“จํ„ฐ)
  • Server : '๋ฌด์–ธ๊ฐ€(์„œ๋น„์Šค, ๋ฆฌ์†Œ์Šค ๋“ฑ)์„ ์ œ๊ณตํ•˜๋Š” ์ปดํ“จํ„ฐ (์›น, ๊ฒŒ์ž„ ์„œ๋ฒ„ ๋“ฑ)

 

Callback

์ˆœ์„œ๋ฅผ ์ œ์–ดํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

const printString = (string) => {
    setTimeout(
        () => {
            console.log(string)
        },
        Math.floor(Math.random() * 100) + 1
    )
}
const printAll = () => {
    printString("A")
    printString("B")
    printString("C")
}
printAll() // ?????????


์ˆœ์ฐจ์ ์œผ๋กœ A,B,C๋ฅผ ์ œ์–ดํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค
๊ทธ๋ž˜์„œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ

const printString = (string, callback) => {
    setTimeout(
        () => {
            console.log(string)
            callback()
        },
        Math.floor(Math.random() * 100) + 1
    )
}
const printAll = () => {
    printString("A", () => {
        printString("B", () => {
            printString("C", () => {})
        })
    })
}
printAll() // now ????????

callback ํ•จ์ˆ˜๋ฅผ ๋ฐ›์•„ ์‹คํ–‰ํ•ด์ฃผ๊ณ ,
A๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๋˜ callback์„ ๋ฐ›์•„ ๋„˜๊น€
callback ํ•จ์ˆ˜ ์•ˆ์—์„œ B๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋˜๋‹ค๋ฅธ callback
....


ABC ์ˆœ์„œ๋ฅผ ์ง€์ผœ์„œ ์ถœ๋ ฅ



const somethingGonnaHappen = callback => {
  waitingUntilSomethingHappens ()
  
  if (isSomethingGood) {
    callback(null, something)	// callback์— ์ธ์ž๋ฅผ ๋„˜๊ฒจ ์คŒ
  }
  
  if (isSomethingBad) {
    callback(something, null)
  }
}
somethingGonnaHappen((err, data) => {
    if (err) {
        console.log('ERR!!');
        return;
    }
    return data;
})

์‚ฌ์šฉ์ž๋ฅผ ๊ณ ๋ คํ•ด์„œ ์• ์ดˆ์— ์ฝœ๋ฐฑ์„ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ์„ค๊ณ„ ๊ฐ€๋Šฅ
์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์•ž์— ์—๋Ÿฌ๋ฅผ ์ฃผ๊ณ  ๋’ค์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด ์ค€๋‹ค.
์•ž์œผ๋กœ API๋‚˜ library๋ฅผ ์“ฐ๋“  ์•ž์— ์—๋Ÿฌ๋ฅผ ์“ฐ๊ณ  ๋’ค์— ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ด ์ƒ๊ธธ ๊ฒƒ์ž„



Promise

const printString = (string) => { 
    return new Promise((resolve, reject) => { //promise ๋‚Ÿ์˜ ์ฝœ๋ฐฑ์„ ๋ฐ›์Œ
    setTimeout(
        () => {
            console.log(string)
            resolve() // ์œ„์—์„œ ์ธ์ž๋กœ ๋ฐ›์•˜๋˜ resolve๋ฅผ ๋ฐ›์Œ
            // ๋งŒ์•ฝ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์—” reject๋„ ์‚ฌ์šฉ
        },
        Math.floor(Math.random() * 100) + 1
        )
    })
}

const printAll = () => {
    printString("A")
    .then(() => {  // .then์œผ๋กœ ์ด์–ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์Œ 
         // printString์ด ๋๋‚˜๋ฉด ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์ค˜~
        return printString("B")
    })
    .then(() => {
        return printString("C")
    })
}
printAll()

๋™์ž‘์€ ์ฝœ๋ฐฑ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘


์ฒซ ํ…Œ์Šคํฌ๊ฐ€ ๋๋‚˜๊ณ  ๋‚˜์„œ ๋‹ค์Œ ํƒœ์Šคํฌ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค
๊ธฐ์กด์— ์ฝœ๋ฐฑ์—์„œ ์—๋Ÿฌ๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ–ˆ๋‹ค๋ฉด -> ์ฝœ๋ฐฑ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ๋งˆ๋‹ค ์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผํ•จ
๊ทผ๋ฐ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด .then, .then -- ํ•ด์„œ ๋งˆ์ง€๋ง‰์— catch๋ฅผ ์ด์šฉํ•ด ์—๋Ÿฌ๋ฅผ ์žก์•„ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ Promise๋ฅผ ํ™œ์šฉํ•œ ๋ฐฉ์‹ ์—ญ์‹œ Callback ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฉ”์†Œ๋“œ๋“ค์ด ์—„์ฒญ๋‚˜๊ฒŒ ์ค‘์ฒฉ๋˜๊ฒŒ ๋˜๋ฉด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค. (Promise Hell)

function wakeUp() {
    return new Promise((resolve, reject) => {
        setTimeout(() => { resolve('wake up') }, 100)
    })
}

function dailyCoding() {
    return new Promise((resolve, reject) => {
        setTimeout(() => { resolve('dailyCoding') }, 100)
    })
}

function haveMeal() {
    return new Promise((resolve, reject) => {
        setTimeout(() => { resolve('haveMeal') }, 100)
    })
}

function lol() {
    return new Promise((resolve, reject) => {
        setTimeout(() => { resolve('lol') }, 100)
    })
}

wakeUp()
.then(data => {
    console.log(data)

    dailyCoding()
    .then(data => {
        console.log(data)

        haveMeal()
        .then(data => {
            console.log(data)
            
            lol()
            .then(data => {
                console.log(data)
        
            })
        })
    })
})

promise hell
โฌ‡๏ธ
promise chain

wakeUp()
.then(data => {
    console.log(data)
    return haveMeal()
})
.then(data => {
    console.log(data)
    return drinkSoju()
})
.then(data => {
    console.log(data)
    return sleep()
})
.then(data => {
    console.log(data)
})



ASYNC / AWAIT

const result = async () => {
    const one = await wakeUp();
    console.log(one)

    const two = await dailyCoding();
    console.log(two)

    const three = await haveMeal();
    console.log(three)

    const four = await lol();
    console.log(four)
}
result (); // wake up, dailyCoding, haveMeal, lol

๋น„๋™๊ธฐ ํ•จ์ˆ˜๋“ค์„ ๋งˆ์น˜ ๋™๊ธฐ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉ.

function wakeUp() {
    return new Promise((resolve, reject) => {
        setTimeout(() => { resolve('wake up') }, 200)
    })
}

function dailyCoding() {
    return new Promise((resolve, reject) => {
        setTimeout(() => { resolve('dailyCoding') }, 100)
    })
}

function haveMeal() {
    return new Promise((resolve, reject) => {
        setTimeout(() => { resolve('haveMeal') }, 500)
    })
}

function lol() {
    return new Promise((resolve, reject) => {
        setTimeout(() => { resolve('lol') }, 10)
    })
}
undefined
const result = async () => {
    const one = await wakeUp();
    console.log(one)

    const two = await dailyCoding();
    console.log(two)

    const three = await haveMeal();
    console.log(three)

    const four = await lol();
    console.log(four)
}

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