[TIL] 코드 스테이츠 블록체인 부트캠프 8기 DAY-8 공부노트(callback, promise, 동기, 비동기)

드림보이즈·2022년 12월 2일
1

오늘의 한 짤 : 우리도 할 수 있다.

오늘의 컨디션 : 7.05 /10

7시간 좀 못 잤음에도 월드컵과 함께 눈을 뜰 수 있었다.
따뜻한 차 마시니 역시 효과는 굉장했다.
금요일이라는 생각에 더 괜찮았다.

무엇을 공부했나? : 동기/비동기, callback, promise, js engine 구조, event loop,

1. 동기(Synchronous) / 비동기(Asynchronous)


동기: A작업이 모두 진행될 때 까지 B작업은 대기
비동기: 요청을 보냈을 때 응답과 상관없이 다음 동작 수행 가능. A작업 시작하면 B작업 시작. A작업은 결과값 나오는대로 출력

-비동기 예시

console.log("1st");
setTimeout(() => {
	console.log("2nd");
    }, 0)
console.log("3rd")

// 1 / null / 3 / 2
// setTimeout은 비동기적 api라 실행하면서 밑으로 내려가고 2는 나오는 대로 출력하니까
  • node.js : non-blocking + 비동기적 런타임
  • block : 하나의 작업이 끝날 때 까지 이어지는 작업을 막는
  • 비동기 사용 예시 : 백그라운드 실행, 로딩 / 서버 요청, 응답 기다림 / 파일 로딩
  • 고차함수 : 함수를 인자로(callback), 함수를 리턴(curry function)
  • 비동기 함수 전달 : 콜백 or 이벤트 등록
  • 예시 : DOM Element 이벤트 핸들러(마우스 키보드 / 페이지) / 타이머 api , 애니메이션 / 서버 자원 요청(fetching, ajax)

Callback

const printString = (string, callback) => {
  setTimeout(() => {
    console.log(string);
    callback();
  }, Math.floor(Math.random() * 100) + 1);
};

const printAll = () => {
  printString("A", () => {
    printString("B", () => {
      printString("C", () => {});
    });
  });
};

printAll();
// A B C

Promise

pending : 대기 (아무것도 안함)
fulfill : 이행 (연산이 성공적으로 완료)
reject: 거부 (연산 실패함)

예시 1.

const printString = (string) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(string);
      resolve();
    }, Math.floor(Math.random() * 100) + 1);
  });
};

const printAll = () => {
  printString("A")
    .then(() => {
      return printString("B");
    })
    .then(() => {
      return printString("C");
    });
};

printAll();

예시 2. 더 깔끔하게

function eatLunch() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("3.eatLunch");
    }, 100);
  });
}
function eatDinner() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("4.goToBed");
    }, 100);
  });
}

eatLunch()
  .then((data) => {
    console.log(data);
    return eatDinner();
  })
  .then((data) => {
    console.log(data);
    return console.log("sleep");
  });

예시 3. 커피 예시로 보는 비동기

// 시작 시간과 현재 시간 비교해 ms 범위 내에서 무한 로프 도는 blocking 함수
function waitSync(ms) {
    var start = Date.now();
    var now = start;
    while(now - start < ms) {
        now = Date.now();
    }

}

function drink(person, coffee) {
    console.log(person + "는" + coffee + "를 마십니다");
}


function orderCoffeeSync(coffee) {
    console.log(coffee + "가 주문되었습니다")
    waitSync(2000);
    return coffee
}

let customers = [
    {name: "joo" , request: "latte"}, {name: "jon", request: "espa"}];

customers.forEach(function(customer) {
    let coffee = orderCoffeeSync(customer.request);
    drink(customer.name, coffee);
});
//latte가 주문되었습니다
//joo는latte를 마십니다
//espa가 주문되었습니다
//jon는espa를 마십니다

심화 1. Event Loop

참고 :

자바스크립트 엔진

  • webikit, v8...
  • js 코드를 해석하고 실행하는 인터프리터
  • Heap + 호출 스택(call stack)
  • 힙 = 메모리 할당 (메모리의 대부분, 변수 객체 등이 저장되는)
  • 콜 스택 = 함수가 호출되는 순서대로 쌓이는 스택, 실행하면 스택에 넣고, 끝나면 빼고
    (호출 스택이 빈다 = 실행할 함수 남아있지 않다)
  • 싱글 스레드 언어 = 호출 스택을 하나만 사용한다 (동시에 하나의 일만 처리 가능)

브라우저 : js 엔진 + web api + callback queue

  • web api : dom + ajax + timeout (비동기 멀티 스레드)
  • callback queue = task queue = web api의 콜백 함수들이 대기하는 큐
  • event loop : 호출 스택과 콜백 큐를 주시하다가, 호출 스택이 비었으면 콜백 큐의 콜 백함수를 집어 넣어줘
  • setTimeOut(callback, 0) 은 즉시 실행일까?

이벤트 루프 참고 영상 : 이해가 기가 막힌다.
https://www.youtube.com/watch?v=wcxWlyps4Vg&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9CTech

심화 2. What is Promise ?

참고 1 : https://velog.io/@cadenzah/What-is-a-Promise
참고 2 : https://joshua1988.github.io/web-development/javascript/promise-for-beginners/

무엇을 느꼈나 ?

코딩을 배우는 게 아니라 뭔가 컴퓨터 공학적인? 기계의 작동원리를 공부하는 기분. 좋다.

웹 프로그래밍 공부하면서 callback, promise를 여러 번 사용하고 공부했지만 명확한 이해는 부족했는데, 이번 기회에 확실하게 알 수 있었다.

js 엔진의 구조를 새로 배웠고, 브라우저의 구조와 작동 원리를 명확하게 배울 수 있었다.

과제 test 도중 에러를 발견했고, 구글링에도 안되는 걸 스스로 해결하고, 공유했다. 더 나은 솔루션도 제안 받았고, 적극성과 자신감, 소속감이 올라갔다.

페어는 뭐 이제 그냥 별 생각없이 들어가도 될 거 같다.

그 외 할 말은?

드디어 주말이다 이십

profile
10년 후 세계 최고 블록체인 개발자

0개의 댓글