제너레이터란 이터레이터를 사용해 자신의 실행을 제어하는 함수입니다. 일반적인 함수는 매개변수를 받고 값을 반환하지만, 호출자는 매개변수 외에는 함수의 실행을 제어할 방법이 전혀 없습니다. 함수를 호출하면 그 함수가 종료될 때까지 제어권을 넘기지만 제너레이터는 그렇지 않습니다.
yield
) 수 있습니다.next()
메서드를 호출함에 따라 실행됩니다.const *gen = () => {
yield 1;
yield 2;
yield 3;
return 'finish' // return 값은 next()를 통해서는 접근 가능하지만 for .. of 로는 접근이 불가 합니다.
}
const iter = gen()
iter.next() // {value: 1, done: false}
iter.next() // {value: 2, done: false}
iter.next() // {value: 3, done: false}
iter.next() // {value: 'finish' , done: true}
제너레이터 함수는 iterator
를 반환 하기 때문에 for ... of
, 스프레드, 구조 분해할당 등 iterator
를 사용하는 곳 모두 사용할 수 있습니다.
const *gen = () => {
const name = yield 'what is your name'
const color = yield 'what is your favorite color'
return `My name is ${name}, my favorite color is ${color}`
}
const iter = gen()
iter.next('ethan') // {value: 'what is your name', done: false}
iter.next('orange') // {value: 'what is your favorite color', done: false}
iter.next() // {value: 'My name is ethan, my favorite color is orange', done: true}
위의 예와 같이 변수 또한 넘겨 줄 수 있습니다.