본문 바로가기
Books/모던 JS Deep Dive ✔️

[모던 JS Deep Dive] 46장 - 제너레이터와 async/await

by Aaron-Kim 2022. 1. 27.

46.1 제너레이터란?

  - ES6 제너레이터: 코드 블록의 실행을 일시 중지했다가 필요한 시점에 재개할 수 있는 특수한 함수

    - 함수 호출자에게 함수 실행의 제어권 양도 가능

      - 함수의 제어권을 함수가 독점하는 것이 아니라 함수 호출자에게 yield할 수 있음

    - 함수 호출자와 함수의 상태를 주고받을 수 있음

      - 함수 호출자에게 상태를 전달할 수 있고 함수 호출자로부터 상태를 전달받을 수 있음

    - 제너레이터 객체 반환

      - 이터러블이면서 동시에 이터레이터인 제너레이터 객체 반환

46.2 제너레이터 함수의 정의

  - function* 키워드로 선언

  - 하나 이상의 yield 표현식 포함

  - 화살표 함수로 정의 불가, 생성자 함수로 호출 불가

46.3 제너레이터 객체

  - 제너레이터 함수 호출 시 제너레이터 객체 반환 (이터러블, 이터레이터)

  - next 메서드 갖는 이터레이터, return과 throw 메서드도 가짐

46.4 제너레이터의 일시 중지와 재개

  - 제너레이터는 yield 키워드와 next 메서드를 통해 실행을 일시 중지했다가 필요한 시점에 다시 재개 가능

  - yield 키워드는 제너레이터 함수의 실행을 일시 중지시키거나 yield 키워드 뒤에 오는 표현식의 평가 결과를

    제너레이터 함수 caller에게 반환

  - 제너레이터 객체의 next 메서드에 인수를 전달하면 제너레이터 함수의 yield 표현식을 할당받는 변수에 할당됨

  - 제너레이터의 특성을 활용하면 비동기 처리를 동기 처리처럼 구현 가능

46.5 제너레이터의 활용

  - 이터러블의 구현

    - 이터레이션 프로토콜을 준수해 이터러블을 생성하는 방식보다 더 간단히 구현 가능

  - 비동기 처리

    - 프로미스 후속 처리 메서드 없이 비동기 처리 결과를 반환하도록 구현 가능

    - 제너레이터 실행기 필요 시 co 라이브러리 사용 권장

46.6 async/await (ES8)

  - async 함수

    - await 키워드는 반드시 async 함수 내부에서 사용

    - 언제나 프로미스 반환

    - 클래스의 constructor 메서드는 async 메서드가 될 수 없음

  - await 키워드

    - 프로미스가 settled 상태 (비동기 처리가 수행된 상태)가 될 때까지 대기하다가

      settled 상태가 되면 프로미스가 resolve한 처리 결과 반환

    - await 키워드는 반드시 프로미스 앞에서 사용해야 함

    - 다음 실행을 일시 중지시켰다가 프로미스가 settled 상태가 되면 다시 재개

  - 에러 처리

    - 에러는 caller 방향으로 전파됨

    - async/await 사용하면 try ... catch 문 사용 가능

    - async 함수 내에서 catch 문을 사용해서 에러 처리를 하지 않으면

      async 함수는 발생한 에러를 reject하는 프로미스 반환

      - async 함수 먼저 호출하고 Promise.prototype.catch 후속 처리 메서드를 사용하여 에러 캐치 가능

반응형

댓글