[Node.js] AsyncIterator 사용 방법 [비동기 객체를 순차적으로 처리하기]

2025. 4. 12. 22:35·◎ JavaScript/Node.js🫒
728x90
반응형


- AsyncIterator 사용 방법

이벤트 기반 스트림을 사용할 때, 비동기 핸들러로 데이터를 처리하면 순서가 꼬일 수 있다.
이 글에서는 'AsyncIterator'를 활용하여 스트림 데이터를 순차적으로 처리하는 방법을 소개한다.

1. 비동기 핸들러 사용 시 병렬 처리

const fs = require('fs');
const { writeFile } = require('fs/promises');

// 잠시 기다리는 비동기 함수
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));

const readStream = fs.createReadStream(__filename, { encoding: 'utf8', highWaterMark: 64 });
const writeFileName = `${__filename}-${Date.now()}`;

const write = async (chunk) => {
    // (Math.random() * 1000)ms 동안 기다린다.
    await sleep(Math.random() * 1000);
    // 파일에 추가 모드로 쓴다.
    await writeFile(writeFileName, chunk, { flag: 'a' });
}

let counter = 0;
readStream.on('data', async (chunk) => {
    console.log(counter);
    counter++;

    await write(chunk);
})

readStream.on('close', () => {
    console.log('close');
})

readStream.on('error', (e) => {
    console.log('error: ', e);
})

병렬로 처리되었기에 순서가 엉망진창이다.


async 함수 내의 await은 해당 콜백 내 비동기 작업을 기다리게 만들지만, on('data')로 들어오는 이벤트 자체는 여전히 비동기적으로 병렬 실행된다.
readStream.on('data', async (chunk) => {
    ...
    await write(chunk); // 이 부분!
});

2.  AsyncIterator를 활용한 순차 처리

병렬 처리가 되던 스트림을 직렬로 처리하려면 아래와 같이 AsyncIterator를 사용하면 된다.
AsyncIterator는 비동기 처리를 구현한 객체를 배열과 같이 반복 처리를 한다.
for await (const 변수 of 비동기를_반복할_수_있는_객체) {
	// ...
}

const fs = require('fs');
const { writeFile } = require('fs/promises');

// 잠시 기다리는 비동기 함수
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));

const writeFileName = `${__filename}-${Date.now()}`;

const write = async (chunk) => {
    // (Math.random() * 1000)ms 동안 기다린다.
    await sleep(Math.random() * 1000);
    // 파일에 추가 모드로 쓴다.
    await writeFile(writeFileName, chunk, { flag: 'a' });
}

const main = async () => {
    const stream = fs.createReadStream(__filename, { encoding: 'utf8', highWaterMark: 64 });
    let counter = 0;
    for await (const chunk of stream) {
        console.log(counter);
        counter++;

        await write(chunk);
    }
}

main()
    .catch((e) => console.error(e));

직렬로 처리되어 기존 파일과 동일하다.


이처럼 `for await...of` 구문을 사용하면 스트림 데이터를 순차적으로 처리할 수 있어, 파일 쓰기나 로그 적재처럼 순서가 중요한 작업에 유용하다.

728x90
반응형
'◎ JavaScript/Node.js🫒' 카테고리의 다른 글
  • [Node.js] 자바스크립트에서 날짜 format 쉽게 지정하기 [Day.js로 날짜 간편하게 다루기]
  • [Node.js] WEB Server 띄우기 [Node.js로 HTTP 서버 기동하기]
예르미(yermi)
예르미(yermi)
끊임없이 제 자신을 계발하는 개발자입니다👨🏻‍💻
  • 예르미(yermi)
    예르미의 코딩노트
    예르미(yermi)
  • 전체
    오늘
    어제
    • 분류 전체보기 (987)
      • ◎ Java (133)
        • Java☕ (93)
        • JSP📋 (26)
        • Applet🧳 (6)
        • Interview👨🏻‍🏫 (8)
      • ◎ JavaScript (48)
        • JavaScript🦎 (25)
        • jQuery🌊 (8)
        • React🌐 (2)
        • Vue.js🔰 (6)
        • Node.js🫒 (3)
        • Google App Script🐑 (4)
      • ◎ HTML5+CSS3 (17)
        • HTML5📝 (8)
        • CSS3🎨 (9)
      • ──────────── (0)
      • ▣ Framework (67)
        • Spring🍃 (36)
        • Spring Boot🍀 (12)
        • Bootstrap💜 (3)
        • Selenium🌕 (6)
        • MyBatis🐣 (10)
      • ▣ Tools (47)
        • API🎯 (18)
        • Library🎲 (15)
        • JitPack🚀 (3)
        • Jenkins👨🏻 (7)
        • Thymeleaf🌿 (4)
      • ▣ Server (30)
        • Apache Tomcat🐱 (14)
        • Apache HTTP Server🛡️ (1)
        • Nginx🧶 (7)
        • OracleXE💿 (4)
        • VisualSVN📡 (4)
      • ▣ Infra & DevOps (5)
        • LGTM Stack🔭 (5)
      • ▣ OS : 운영체제 (18)
        • cmd : 명령프롬프트💻 (10)
        • Linux🐧 (8)
      • ▣ SQL : Database (56)
        • Oracle SQL🏮 (26)
        • PL SQL💾 (9)
        • MySQL🐬 (6)
        • MariaDB🦦 (6)
        • H2 Database🔠 (3)
        • SQL 실전문제🐌 (6)
      • ────────── (0)
      • ◈ Human Project (86)
        • Mini : Library Service📚 (15)
        • 화면 설계 [HTML]🐯 (10)
        • 서버 프로그램 구현🦁 (15)
        • Team : 여수어때🛫 (19)
        • Custom : Student🏫 (9)
        • Custom : Board📖 (18)
      • ◈ Yermi Project (40)
        • 조사모아(Josa-moa)📬 (5)
        • Riddle-Game🧩 (6)
        • 맛있을 지도🍚 (2)
        • 어디 가! 박대리!🙋🏻‍♂️ (5)
        • 조크베어🐻‍❄️ (4)
        • Looks Like Thirty🦉 (2)
        • Toy Project💎 (12)
        • 오픈소스 파헤치기🪐 (4)
      • ◈ Refactoring (15)
        • Mini : Library Service📚 (8)
        • 서버 프로그램 구현🦁 (1)
        • Team : 여수어때🛫 (0)
        • 쿼리 튜닝일지🔧 (6)
      • ◈ Coding Test (80)
        • 백준(BOJ)👨🏻‍💻 (71)
        • 프로그래머스😎 (2)
        • 코드트리🌳 (7)
      • ◈ Study (129)
        • 기초튼튼 개발지식🥔 (25)
        • HTTP 웹 지식💡 (4)
        • 클린코드(Clean Code)🩺 (1)
        • 디자인패턴(GoF)🥞 (12)
        • 알고리즘(Algorithm)🎡 (14)
        • 다이어그램(Diagram)📈 (4)
        • 파이썬(Python)🐍 (16)
        • 에러노트(Error Note)🧱 (34)
        • 웹 보안(Web Security)🔐 (11)
        • 인공지능 AI🛸 (8)
      • ◈ 공부모임 (55)
        • 혼공학습단⏰ (18)
        • 코드트리 챌린지👊🏻 (2)
        • 개발도서 100독👟 (8)
        • 나는 리뷰어다🌾 (15)
        • 국가기술자격 서포터즈🌻 (12)
      • ◈ 자격증 공부 (37)
        • 정보처리기사🔱 (16)
        • 정보처리산업기사🔅 (9)
        • 정보보안기사⚜️ (0)
        • 컴퓨터활용능력 1급📼 (12)
      • ─────────── (0)
      • ◐ 기타 (124)
        • 알아두면 좋은 팁(tip)✨ (46)
        • 개발자의 일상🎈 (55)
        • 개발도서 서평🔍 (10)
        • 개발관련 세미나🎤 (2)
        • 블로그 꾸미기🎀 (9)
        • 사도신경 프로젝트🎚️ (2)
  • 인기 글

  • 최근 댓글

  • 반응형
    250x250
  • 태그

    javascript
    코딩
    Error Note
    SQL
    spring
    jsp
    백준
    꿀팁
    CSS
    프로그래밍
    html
    Java
    Database
    백준 티어
    Oracle
    BOJ
    일상
    Project
    코딩 테스트
    자바스크립트
  • hELLO· Designed By정상우.v4.10.3
예르미(yermi)
[Node.js] AsyncIterator 사용 방법 [비동기 객체를 순차적으로 처리하기]
상단으로

티스토리툴바