주요 내용은 다음과 같다.

 

  1. 자바스크립트의 콜백함수의 개념과 예시에 대해 학습
  2. 어떤 항목에서 콜백함수를 전달받은 함수에게 제어권이 이양되는지를 이해하고 그 예시를 테스트
  3. 비동기적인 코드 작성에서 발생할 수 있는 콜백지옥을 예방하고 비동기제어를 할 수 있는 Promise, async/await 등의 기술을 이해하고 활용하는 능력 배양

 

 

 

1. 콜백 함수 

콜백 함수는 이전 부터 계속 등장했던 함수이다.

함수 또는 메서드의 인자 부분에 함수가 들어가는것이 가능한데,  ( 일급 객체 )

그렇게 인자로써 매개변수로 넘겨지는 함수를 콜백 함수라고 한다.

 

이번 주차에서는 추가로 제어권에 관한 학습을 진행한다.

 

제어권 ??

 

쉽게 말하면,

cbFunc(); 일반 함수실행의 경우, 사용자가 해당 함수를 실행하도록 만든것이고

setInterval(cbFunc, 300);  의 경우, setInterval 메서드가 (cbFunc, 300) 를 실행하는 것이다.

 

 

콜백함수도 함수다

var obj = {
	vals: [1, 2, 3],
	logValues: function(v, i) {
		console.log(this, v, i);
	}
};

//method로써 호출
obj.logValues(1, 2);

//callback => obj를 this로 하는 메서드를 그대로 전달한게 아니에요
//단지, obj.logValues가 가리키는 함수만 전달한거에요(obj 객체와는 연관이 없습니다)
[4, 5, 6].forEach(obj.logValues);

 

위 예시는 콜백함수의 함정에 가까운 부분으로, 

언뜻 보면 ~forEach(obj.logvalues)   obj 객체를 대상으로하는 logvalues 메서드 이기 때문에 

obj 에 this가 바인딩 될것 같지만,

사실 저 부분은, obj의 logvalues가 인자를 인질로 가지고 있다.. 정도 밖에 안된다

어디까지나, 인자이기 때문

 

obj 가 아닌 global 이 우수수

 

 

 

 

콜백 지옥

 

 

 

대체 어느 부분이 어느 함수의 내용인지 알기가 어렵게 되어버린다.

코드를 짜다 보니 저렇게 될 수도 있다는 것인데,

수정과 유지보수 또한 hell 이기 때문에 최대한 지양해야한다.

 

 

동기와 비동기

 

 

동기란, 1-2-3-4-5 작업이 있을 때, 1번 작업이 완료되지 않는다면, 2-3-4-5 작업이 영원히 실행조차 안되는걸 말한다.

 

비 동기란, 동기의 반대말 !!

1번 작업이 완료되지 않더라도 상황에 따라 다음 순서의 작업이 실행되고, 완료 될 수 있다는 것을 말한다.

 

 

예시를 들자면...........으음

 

사격장에서 사격 훈련을 한다고 했을때,

 

동기 => 

1번 사수 사격- > 완료 -> 2번 사수 사격 -> 완료 -> 3번 사수 사격 -> 완료

 

비 동기 =>

준비된 사수로부터 사격 개시 => 완료 순서도 제각각

 

라고 할 수 있겠다.

 

 

콜백 지옥 해결법? 

setTimeout(
  function (name) {
    var coffeeList = name;
    console.log(coffeeList);

    setTimeout(
      function (name) {
        coffeeList += ", " + name;
        console.log(coffeeList);

        setTimeout(
          function (name) {
            coffeeList += ", " + name;
            console.log(coffeeList);

            setTimeout(
              function (name) {
                coffeeList += ", " + name;
                console.log(coffeeList);
              },
              500,
              "카페라떼"
            );
          },
          500,
          "카페모카"
        );
      },
      500,
      "아메리카노"
    );
  },
  500,
  "에스프레소"
);

 

보기만 해도 현기증이 나는 평범한 콜백 지옥이다.

 

강의에서는 

 

1.  기명함수로 변환  

2. 비 동기 작업의 동기적 표현

 2-1 ) promise

 2-2 ) Generator

 2-3 ) Promise + Async/await 

 

을 소개해주었다.

 

여기서 좀 더 중요한 녀석은 비 동기 작업을 동기적으로 표현한다는 내용인데, 

 

왜 굳이 비 동기 작업을 동기적으로 바꾸려고 할까?  라고 생각이 든다면, 

 

일에는 순서가 있는 법이야 를  떠올려 보자.

물론 가독성과 유지보수의 문제도 있겠다만,

 

우리는 음식을 주문받는 일과, 요리가 만들어지는 과정, 요리가 서빙되는 과정이

동시에 시작될 수 없다는 것을 잘 알고있다 .

 

주문을 받고-> 요리가 만들어지고-> 서빙이 되어야 하기 때문이다....

???

 

말하고 보니까 굉장히 이상한 느낌이 든다..

 

애초에 한번에 한 가지의 동작만 수행하도록 되어있는 동기식 언어인 JS에서, 

효율을 위해 Queue , call stack 등을 이용해 비 동기식으로 처리될 수 있게끔 만들었고,

그렇게 만들어진 비 동기 방식을 우리는 다시 동기적으로 표현할 수 있어야 한다.

 

 

 

 

 

'내일배움캠프' 카테고리의 다른 글

[내일배움캠프] 24.08.21 TIL  (0) 2024.08.21
[내일배움캠프] 24.08.20 TIL  (0) 2024.08.20
[내일배움캠프] 24.08.16 TIL  (0) 2024.08.16
[내일배움캠프] 24.08.14 TIL  (0) 2024.08.14
[내일배움캠프] 24.08.13 TIL  (0) 2024.08.13

+ Recent posts