Get to know MDN better
This page was translated from English by the community. Learn more and join the MDN Web Docs community.
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2020년 1월.
for await...of 문은 동기 이터러블뿐만 아니라 비동기 이터러블 객체를 순환하는 루프를 생성합니다. 이 문은 비동기 함수 본문 내부 와 모듈 내부를 포함하여 await를 사용할 수 있는 맥락에서만 사용할 수 있습니다.
반복할 때마다 시퀀스에서 값을 받습니다. const, let, 또는 var를 사용한 선언이거나, 할당 연산자의 대상일 수 있습니다. (예: 이전에 선언된 변수 또는 객체 속성) var로 선언된 변수는 루프에 대한 로컬이 아닙니다. 즉, 해당 변수는 for await...of 루프가 있는 동일한 범위에 있습니다.
iterable비동기 이터러블 또는 동기 이터러블입니다. 루프가 작동하는 값 시퀀스의 소스입니다.
statement반복할 때마다 실행할 명령문입니다. variable을 참조할 수 있습니다. 블록 문을 사용하여 여러 문을 실행할 수 있습니다.
for await...of 루프가 이터러블을 반복할 때, 먼저 비동기 이터레이터를 반환하는 이터러블의 [@@asyncIterator]() 메서드를 가져와 호출합니다. @asyncIterator 메서드가 없으면 동기 이터레이터를 반환하는 [@@iterator]() 메서드를 찾습니다. 그런 다음 반환된 동기 이터레이터는 next(), return(), 그리고 throw() 메서드에서 반환된 모든 객체를 이행되거나 거부된 프로미스로 래핑하여 비동기 이터레이터로 래핑합니다. value 속성도 프로미스인 경우 이행됩니다. 그런 다음 루프는 최종 비동기 이터레이터의 next() 메서드를 반복적으로 호출하고 반환된 프로미스를 await하며 변수에 할당할 일련의 value를 생성합니다.
for await...of 루프가 일찍 종료되면(예: break 문이 발생하거나 오류가 발생한 경우) 정리를 수행하기 위해 이터레이터의 return() 메서드가 호출됩니다. 반환된 프로미스는 루프가 종료되기 전에 await됩니다.
for await...of는 일반적으로 for...of 루프와 동일하게 기능하며 동일한 구문과 의미를 공유합니다. 아래의 몇 가지 차이점은 있습니다.
비동기 이터러블 프로토콜을 명시적으로 구현하는 객체를 반복할 수도 있습니다.
비동기 제너레이터 함수의 반환 값은 비동기 이터러블 프로토콜을 준수하므로 for await...of를 사용하여 반복할 수 있습니다.
for await...of를 사용하여 비동기 제너레이터를 반복하는 보다 구체적인 예제를 위해 API에서 데이터를 순회하는 것을 생각해 보겠습니다.
이 예제는 먼저 데이터 스트림에 대한 비동기 이터러블을 생성한 다음, 이를 사용하여 API 응답의 크기를 찾습니다.
for await...of 루프에서 동기 이터러블과 동기 제너레이터도 사용할 수 있습니다. 이 경우, 산출된 값을 루프 제어 변수에 할당하기 전에 내부적으로 await합니다.
참고 : 동기 제너레이터에서 거부된 프로미스 yield에 유의하세요. 이 경우 for await...of는 거부된 프로미스를 처리할 때 throw를 하고, 해당 제너레이터의 finally 블록을 호출하지 않습니다. 이것은 할당된 일부 리소스를 try/finally로 해제해야 하는 경우에 바람직하지 않을 수 있습니다.
동기 제어레이터의 finally 블록을 항상 호출되게 만드려면, 루프의 적절한 형식(비동기 제너레이터의 경우 for await...of, 동기 제너레이터의 경우 for...of)을 사용하고 루프 내에서 명시적으로 yield된 프로미스를 await해야 합니다.
| ECMAScript® 2027 Language Specification # sec-for-in-and-for-of-statements |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 2025년 2월 11일 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.