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 후속 처리 메서드를 사용하여 에러 캐치 가능
'Books > 모던 JS Deep Dive ✔️' 카테고리의 다른 글
[모던 JS Deep Dive] 48장 - 모듈 (0) | 2022.01.27 |
---|---|
[모던 JS Deep Dive] 47장 - 에러 처리 (0) | 2022.01.27 |
[모던 JS Deep Dive] 45장 - 프로미스 (0) | 2022.01.27 |
[모던 JS Deep Dive] 44장 - REST API (0) | 2022.01.26 |
[모던 JS Deep Dive] 43장 - Ajax (0) | 2022.01.26 |
댓글