TIL 21 | JavaScript callback

Saemsol Yoo·2020년 12월 24일
0

javascript

목록 보기
12/25
post-thumbnail

https://youtu.be/s1vpVCrT8f4
드림코딩 by 엘리 님의 유튜브 강의를 보며 정리한 내용입니다.


1. Synchronous, Asynchronous

1-1. Synchronous

JavaScript is synchronous.
→ Execute the code block in order after hoisting!
→ hoisting이 된 이후부터 코드가 나타나는 순서대로 자동적으로 실행이 된다.(=동기적으로)

☁️ hoisting : var, function declaration 선언들이 자동적으로 제일 위로 올라가는것!

console.log('1');  //동기
console.log('2');  //동기
console.log('3');  //동기
//1
//2
//3  ... 작성한 코드 순서대로 출력이 된다.

1-2. Asynchronous

비동기적으로, 언제 코드가 실행될지 예측할 수 없는 것을 말한다.

console.log('1');           //동기
setTimeout(function() {
  console.log('2');
}, 1000);                   //비동기
console.log('3');           //동기

//1
//3
//2

//보통은 arrow function 으로 간단하게 전달한다.
//setTimeout(() => console.log('2'), 1000);  //비동기

→ 이것이 asynchronous,(=비동기) 적인 실행 방법이다.



2. callback의 실행방법

🤔 그럼 콜백은 항상 비동기일 때만 쓸까?
🤚🏻 아니다! callback 도 두가지의 경우로 나눠진다.

  • Synchronous callback (즉각적으로, 동기적으로 실행)
  • Asynchronous callback (나중에, 언제 실행될지 예측할 수 없다)

2-1. Synchronous callback

callback을 parameter 인자로 받아서 처리하는 함수를 만들어보자.

function printImmediately(print) {
	print();
};  // ... 동기

printImmediately(() => console.log('hello'));  //hello      ... 동기

→ printImmediately 라는 함수는 print하는 콜백을 받아서 그 콜백을 바로 실행하는 함수이다.
→ 그리고 이때 이 함수의 선언은 hoisting이 되기 때문에 제일 위로 호이스팅이 된다. ⬆️


2-2. Asynchronous callback

function printWithDelay(print, timeout){
  setTimeout(print, timeout)
};  // ... 비동기


printWithDelay(() => console.log('async callback'), 2000);  // ...  비동기
//2초뒤에 ... async callback 

→ printWithDelay 라는 함수는 2개의 인자를 받는다. 그 인자들은 print하는 것과, 얼마정도 timeout을 하고 싶은지이다.
→ 그리고 setTimeout 이라는 브라우저 API를 이용해서, 우리가 원하는 print라는 콜백함수를 호출하고, timeout이라는 인자로 비동기적인 실행을 한다.
→ 물론 이 함수의 선언도 hoisting이 되어 제일 위로 올라가게 된다. ⬆️

JavaScript는 이렇게 함수를 callback 형태로, 인자로, 그리고 다른 함수에 전달할 수도 있고, 또는 변수에 할당할 수도 있는 언어이다.



3. Callback Hell 🔥💩

콜백함수들을 계속계속 묶어나가서 nesting 하면서, 콜백함수 안에서 다른 콜백함수를 부르고 부르고 부르고 부르고 ... 콜백지옥 발생 ^^
→ 나중에 promiseasync 를 배우면 콜백지옥을 고칠 수 있다!


Callback Hell example


이제 이렇게 만든 class를 이용해서 코딩을 해보자!

  1. 사용자에게 idpassword 를 입력받아오기.
  2. 입력받아온 idpassword 를 이용해서 서버에게 요청 "로그인해줘"
  3. 로그인이 성공적으로 된다면? 로그인한 사용자의 id를 다시 받아온다.
  4. 받아온 id를 이용해서 Roles 를 다시 요청해서 받아 올 거다.
  5. 그리고 역할을 요청해서 성공적으로 받아와 진다면? 우리에게는 사용자의 object를 출력해 보겠다.

→ 문제점 : 그 안에서 콜백 호출, 그 안에서 콜백 전달하고.. 전달하고.. 전달하고.. ㅠㅠ

  • 가독성이 너무 많이 떨어진다.
  • 비지니스 로직을 한 눈에 이해하기도 너무 어렵다.
  • 에러가 발생하거나 디버깅을 해야 하는 경우에도 굉장히 굉장히 어렵다.
  • 유지 보수도 어렵다.
profile
Becoming a front-end developer 🌱

0개의 댓글