👋 async/await - Symbol.asyncIterator, Symbol.iterator와 차이
1. Symbol.asyncIterator
Symbol.asyncIterator
는for-await-of
에 대응하는Well-known Symbol
이면 비동기로 반복을 실행 함Well-known Symbol
은 12개임Symbol.iterator
와 차이Symbol.asyncIterator()
를 호출하면AsyncIterator
인스턴스를 생성하여 반환함- 생성한 인스턴스의
next()
를 호출하면{value: 값, done: false}
형태로 반환하며 이 값을Promise.resolve()
의 파라미터 값으로 사용함 for-await-of
로 반복함-
Symbol.asyncIterator
와 제너레이터 함수async function* point() { yield 10; } const gen = point(); console.log(gen[Symbol.toStringTag]); console.log(gen[Symbol.asyncIterator]); console.log(gen[Symbol.asyncIterator]().next); // 1. const gen = point(); AsyncGenerator 인스턴스를 생성하여 반환함 // 2. gen[Symbol.toStringTag], AsyncGenerator를 출력함 // 3. gen[Symbol.asyncIterator, gen 인스턴스의 Symbol.asyncIterator를 출력하며 함수가 출력됨 // 4. gen[Symbol.asyncIterator]().next, asyncIterator 인스턴스를 생성하여 반환하며 인스턴스에는 next()가 있음 // 실행결과 // AsyncGenerator // function[Symbol.asyncIterator]() { [native code] } // function next() { [native code] }
-
for-await-of
반복async function* point() { yield 10; yield 20; } const gen = point(); async function show() { for await (const point of gen) { console.log(point); } } show(); // 1. for await (const point of gen) {...}, gen은 AsyncGenerator 인스턴스 임 gen의 Symbol.asyncIterator()를 호출함 // 2. AsyncIterator 인스턴스를 생성하여 반환하며 인스턴스의 next()를 호출함 // 3. yield 10을 { value: 10, done: false }로 반환하며 Promise.resolve(param)의 파라미터 값으로 사용하여 for-await-of로 보냄 // 4. { value: 10 }에서 10을 point에 설정함 // 실행결과 // 10 // 20