Generator는무엇인가?
Generator function 으로반환된값을 Generator Object 라고하고
이 Generator Obejct 는 iterator 프로토콜을따르고 있다. 즉
[Symbol.iterator] 가 프로퍼티에추가되어있다는것이다. Generator
function 안에서는 yield 라는키워드를사용해서함수내부에작성된코
드를전부실행하지않는다. 제너레이터함수는 yield 를기준으로실행을나
누어서진행한다. iterator 프로토콜을따르고 있기 때문에순차적으로실
행할수있는것이다.
cf> Generator function 를 제너레이터 함수 로, Generator
Object 를 제너레이터 오브젝트 로 표기.
yield 키워드, 함수를실행하고멈출수있다.
[returnValue] = yield[expression]
위와같은구문으로 yield 를작성할수있다.
위의예제코드에서살펴봤듯이, next() 메소드의반환값은 value 와
done 으로구성되어있는오브젝트이다. 제너레이터의메소드 next() 에서
이두가지의값은yield에의해결정된다. value 가 결정되는규칙이조금 복
잡하다.
예제 코드를 살펴보자.
function*calc(prev, post) {
let result = 0;
console.log(`Initial result: ${result}`);
result = yield prev + post;
console.log(`Middle result: ${result}`);
result = yield;
console.log(`Last result: ${result}`);
}
let generator = calc(10, 20);
위에서언급한규칙에대한내용을모두담고 있는예제코드이다.
console.log() 에는어떠한값이찍히게 될까? 코드를통해하나씩살펴보
자.
13.
console.log(generator.next());
// Initial result:0
// { value: 30, done: false }
next() 메소드를실행시키면첫번째yield까지실행한다.
초기 result 변수에대한값이출력되고,
expression 으로계산된값인 30 이 value 이출력된다.
아직 yield 가 남았으니 done 은 false 가 되겠다.
console.log(generator.next(20));
// Last result:20
// { value: undefined, done: true }
남은yield가 없으므로brace까지실행한다.
next() 메소드의파라미터로넘겨진 20 이 result 변수에할당된것을
확인할수있다.
더이상 yield 키워드가 없으므로 done 은 true 가 된다.
16.
yield 대신return
function* calc(prev,post) {
return prev + post;
}
let generator = calc(10, 20);
console.log(generator.next());
// { value: 30, done: true }
return 키워드뒤에오는값이 value 에할당되고 yield 키워드의유무
와상관없이 done 에는 true 가 할당된다. return 은수행되고 있는이터
레이터를종료시키는역할을수행한다.