Promise vs Callback vs Async...Await

devAnderson·2022년 2월 11일
0

TIL

목록 보기
55/106

중복되어도, 복습의 개념 및 설명할 수 있는 정도로의 개념으로 재학습해서 정리한다

⌚️ Promise와 callback

  • 비동기 작업은 콜스텍이 아닌 브라우저 기준 web API에 의해 캐치되어 콜백 큐에 준비되는 대로(즉 함수객체 평가 => 실행 컨텍스트 형성 및 렉시컬 환경 생성) 세팅된 뒤에 콜스텍이 비게 되면 실행되게 된다.
    스크린샷 2022-02-11 오전 10 10 48

  • 이런 특성으로 인해 비동기 작업이 반드시 순차적으로 진행될 것이라는 보장이 없으므로, 하나의 비동기 작업 함수가 끝나면 그다음 비동기 함수의 작업이 실행되도록 매개변수에 함수 객체값을 전달하여 실행되게 만들어야 한다.
    스크린샷 2022-02-11 오전 10 15 38

  • 하지만, 이렇게 되면 깊이가 깊어지게 되어 유지보수가 어렵게 되므로 Promise 방식을 사용하는 것이 일반적이다.

  • Promise는 비동기적인 작업을 Listening할 수 있는 특수한 객체이다

  • new Promise를 통해 생성하면 내부에 프로미스 상태 슬롯과, 프로미스 결과, then,catch,finally를 보유하고 있고 constructor 프로퍼티에는 각종 정적 메서드(resolve, reject, race, all 과 같은) 이 존재한다.
    스크린샷 2022-02-11 오전 10 21 04

  • 비동기 작업이 끝마쳐지면, [[PromiseState]] 와 [[PromiseResult]] 업데이트되고, 이 값을 전체 내부 메서드들이 리스닝하고 있다.

  • 여기서 객체 내부 소비자 메서드 then, catch, finally를 호출하여 내부에서 순차적인 비동기 작업이 가능하다. 해당 메서드들은 다시금 Promise 객체를 리턴하기 때문에 체이닝이 가능해진다.

  • then은 "fullfilled". catch는 "rejected" 상태를 구독하고 있다.

  • 세 소비자 메서드들은 마이크로 테스크 큐라고 하는 특수한 큐에 들어가게 되며, Promise 객체가 생성되어 인자로 전달된 resolver 함수(resolve,reject를 전달받는) 가 실행이 완료가 될 때에 PromiseState에 따라서 탐색되어 실행된다. (ex, reject 상태라면 마이크로테스트큐의 앞에서부터 훑어보며 catch를 찾아냄)

⌚️ async await

  • async가 붙게 되면 암묵적으로 해당 함수가 리턴하는 값은 프로미스 객체화 하여 담겨서 나오게 된다.
  • 함수 내에 await 키워드가 붙은 함수가 호출이 된다면 실행 컨텍스트의 내부 실행이 잠시 멈추고 해당 비동기 작업이 끝마쳐지기를 기다리게 된다.
  • 이 JS엔진이 스크립트를 실행하는 것을 "기다린다" 는 특성 덕택에, try...catch에서 사용하면 유용하다. (일반적으로 Try~ catch는 비동기 작업에 대한 에러를 잡아내지 못하지만 await을 사용하면 해당 작업을 마치 동기적인 것처럼 작업하다가 실패 결과가 업데이트 되면 catch 블록에 전달되기 때문이다)
profile
자라나라 프론트엔드 개발새싹!

0개의 댓글

관련 채용 정보