320x100
320x100
비동기 이터레이터 (async 이터레이터)
: 비동기적으로 들어오는 데이터를 필요에 따라 처리할 수 있음
: 비동기 제너레이터를 같이 사용하면 더 편리하게 처리할 수 있음
- 일반 이터레이터의 처리
let range = {
from: 1,
to: 5,
// for..of 최초 실행 시, Symbol.iterator가 호출됩니다.
[Symbol.iterator]() {
// Symbol.iterator메서드는 이터레이터 객체를 반환합니다.
// 이후 for..of는 반환된 이터레이터 객체만을 대상으로 동작하는데,
// 다음 값은 next()에서 정해집니다.
return {
current: this.from,
last: this.to,
// for..of 반복문에 의해 각 이터레이션마다 next()가 호출됩니다.
next() { // (2)
// next()는 객체 형태의 값, {done:.., value :...}를 반환합니다.
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
}
};
for(let value of range) {
alert(value); // 1, 2, 3, 4, 5
}
- 비동기적으로 값을 반환하는 이터러블 객체
let range = {
from: 1,
to: 5,
// for await..of 최초 실행 시, Symbol.asyncIterator가 호출됩니다.
[Symbol.asyncIterator]() { // (1)
// Symbol.asyncIterator 메서드는 이터레이터 객체를 반환합니다.
// 이후 for await..of는 반환된 이터레이터 객체만을 대상으로 동작하는데,
// 다음 값은 next()에서 정해집니다.
return {
current: this.from,
last: this.to,
// for await..of 반복문에 의해 각 이터레이션마다 next()가 호출됩니다.
async next() { // (2)
// next()는 객체 형태의 값, {done:.., value :...}를 반환합니다.
// (객체는 async에 의해 자동으로 프라미스로 감싸집니다.)
// 비동기로 무언가를 하기 위해 await를 사용할 수 있습니다.
await new Promise(resolve => setTimeout(resolve, 1000)); // (3)
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
}
};
(async () => {
for await (let value of range) { // (4)
alert(value); // 1,2,3,4,5
}
})()
※ ...은 비동기적으로 동작하지 않음
비동기 제너레이터 (async 제너레이터)
async function* generateSequence(start, end) {
for (let i = start; i <= end; i++) {
// await를 사용할 수 있습니다!
await new Promise(resolve => setTimeout(resolve, 1000));
yield i;
}
}
(async () => {
let generator = generateSequence(1, 5);
for await (let value of generator) {
alert(value); // 1, 2, 3, 4, 5
}
})();
result = await generator.next(); // result = {value: ..., done: true/false}
async 이터러블
let range = {
from: 1,
to: 5,
async *[Symbol.asyncIterator]() { // [Symbol.asyncIterator]: async function*()와 동일
for(let value = this.from; value <= this.to; value++) {
// 값 사이 사이에 약간의 공백을 줌
await new Promise(resolve => setTimeout(resolve, 1000));
yield value;
}
}
};
(async () => {
for await (let value of range) {
alert(value); // 1, 2, 3, 4, 5
}
})();
Refference
300x250
728x90
'Programming > JavaScript' 카테고리의 다른 글
모던 자바스크립트 (모듈) 12-2. 모듈 내보내고 가져오기 (0) | 2022.04.23 |
---|---|
모던 자바스크립트 (모듈) 12-1. 모듈 (0) | 2022.04.23 |
모던 자바스크립트 10. 제너레이터 (0) | 2022.04.23 |
모던 자바스크립트 (promise와 async, await) 9-3. async와 await (0) | 2022.04.23 |
모던 자바스크립트 (promise와 async, await) 9-2. 프라미스 체이닝 / 에러 핸들링 / API / 프라미스화 / 마이크로 태스크 (0) | 2022.04.23 |