비동기 구조를 동기적 코드방식으로 작성할 수 있게한다
async await
도 제너레이터 기반으로 만들어 졌다async await
이터레이터와 이터러블을 쉽게 사용 할 수 있다
next()
코드와 Symbol.iterator()
코드를 이미 내장하고 있다generator 함수는 동시적 특성
, 코루틴 특성
을 가지고있다
next()
메서드를 호출하면 저장해 놓은 스택 프레임들을 복원 한다.코루틴 특성
을 잘이용하면 쓰레드 프로그래밍 없이 동시성 프로그래밍이 가능해진다메모리 효율에 기여 할 수 있다
next()
호출해 시간을 지연하며 작업할 수 있다function* quips(name) {
yield "hello " + name + "!";
yield "i hope you are enjoying the blog posts";
if (name.startsWith("X")) {
yield "it's cool how your name starts with X, " + name;
}
yield "see you later!";
}
// yield는 return 과 비슷
// return은 함수당 한번 실행되지만
// yield 는 여러번 실행 가능
// 함수는 스스로 실행을 멈출 수 없지만
// 제너레이터 함수는 실행을 멈출 수 있다
> var iter = quips("jorendorff");
[object Generator]
// 함수를 바로 호출하지 않고 제너레이터 객체 를 리턴
> iter.next()
{ value: "hello jorendorff!", done: false }
> iter.next()
{ value: "i hope you are enjoying the blog posts", done: false }
> iter.next()
{ value: "see you later!", done: false }
> iter.next()
{ value: undefined, done: true }
// 다음 yield 구분에 다 다를 때까지 계속 실행
// .done이 true가 되고 마지막에 undefined를 리턴
Symbol.iterator()
, . next()
두가지 메소드 구현만으로도 자기만의 이터레이터를 만들수 있다.
Symbol.iterator
메서드를 추가해야한다next()
메서드를 통해 하나씩 출력한다const iterableObj = {
[Symbol.iterator]() {
let step = 0;
return {
next() {
step++;
if (step === 1) {
return { value: 'This', done: false};
} else if (step === 2) {
return { value: 'is', done: false};
} else if (step === 3) {
return { value: 'iterable.', done: false};
}
return { value: '', done: true };
}
}
},
}
for (const val of iterableObj) {
console.log(val);
}
// 출력
// This
// is
// iterable.
generator를 이용해서 만든 이터레이터
Symbol.iterator()
, next()
가 이미 구현 되어있다
function * iterableObj() {
yield 'This';
yield 'is';
yield 'iterable.'
}
for (const val of iterableObj()) {
console.log(val);
}
// 모든 generator 는 symbol.iterator와 .next()를 기본 내장 하고있다
// 호출 될때마다 다음 yield 까지 구동
// this가 바뀌고 next() 호출
// 동일하게 출력