TypeScript Async Iterator

for-await-of가 소비하는 비동기 스트림 계약

비동기 이터레이터는 next 결과도 Promise이므로 데이터가 도착하는 속도에 맞춰 순차적으로 값을 소비한다.

01

소스 준비

네트워크 스트림, 페이지네이션, 큐처럼 값이 늦게 생기는 소스를 감싼다.

async source
02

next 대기

반복문은 각 next Promise가 resolve될 때까지 기다린 뒤 본문을 실행한다.

backpressure
03

중간 처리

각 chunk를 변환하거나 저장하며 필요하면 break로 소비를 중단한다.

consume
04

비동기 스트림 처리 마무리

반복이 끝나거나 중단되면 stream close, cursor release 같은 cleanup을 수행한다.

finally
Stream
파일이나 HTTP 응답처럼 chunk 단위 처리에 맞다. 전체를 메모리에 올리지 않고 도착한 만큼 처리한다.
bounded memory
Page
API 페이지네이션을 호출부에서는 단일 반복처럼 읽게 만든다. cursor와 retry 정책은 iterator 내부에 둘 수 있다.
hide pagination
Cancel
중단 시 리소스 정리가 없으면 연결과 cursor가 남는다. try/finally 또는 return 구현으로 종료 경로를 챙긴다.
정리 계약

비동기 반복 점검

순서 보장 각 값을 순서대로 처리해야 하는지 병렬 처리해도 되는지 분리한다.
오류 위치 소스 오류와 소비 처리 오류를 로그에서 구분한다.
취소 break, throw, abort signal이 리소스 정리로 이어진다.

소비 예시

for await (const chunk of responseStream) {
  await writeChunk(chunk);
        overflow-wrap: break-word;
        word-break: keep-all;
      }