[JS] Generator

Haeseo Lee·2023년 4월 7일
0

Javascript

목록 보기
2/2
post-thumbnail

generator

함수의 실행을 중간에 멈췄다가 재개할 수 있다

function* fn() {
  yield 'a';
  yield 'b';
  yield 'c';
};

const a = fn();

console.log(a.next());
console.log(a.next());
console.log(a.next());
// 출력결과
> Object { value: "a", done: false }
> Object { value: "b", done: false }
> Object { value: "c", done: false }
  • next()
    • 다음 yield문을 만날 때까지 코드를 실행
    • value와 done 속성을 가진 객체를 반환
      • value: yield 오른쪽에 있는 값
      • done: 함수 실행이 다 끝났는지 여부 (true/false)
  • return()
    • 즉시 done 값이 true가 됨
    • return() 이후에 next를 실행하게 되면 value는 undefined가 되고 done은 true로 나옴
  • throw()
    • 즉시 done 값이 true가 됨

    • 에러 처리용


generator는 iterator이면서 iterable 객체

  • Symbol.iterator가 구현되어야 함
    • 반환결과는 iterator
function* fn() {
	const num1 = yield "첫번째 숫자";
	console.log(num1);

	const num2 = yield "두번째 숫자";
	console.log(num2);

	return num1 + num2;
}

const a = fn();
a.next();
>> {value: "첫 번째 숫자", done: false}
a.next(5);
>> 5
>> {value: "두 번째 숫자", done: false}
a.next(7);
>> 7
>> {value: 12, done: false}
  • Generator는 값을 미리 만들어 두지 않기 때문에 메모리 측면에서 효율적
    • 필요한 값만 그 때 그 때 생성함
function* fn() {
	let index = 0;
	while (true) {
		yield index++;
	}
}

const a = fn();
a.next();
>> {value: 0, done: false}
a.next();
>> {value: 1, done: false}
a.next();
>> {value: 2, done: false}

yield*

다른 generator를 불러온다

function* gen1() {
	yield "W";
	yield "o";
	yield "r";
	yield "l";
	yield "d";
}

function* gen2() {
	yield "Hello,";
	yield* gen1();
	yield "!";
}
console.log(...gen2());
>> Hello, W o r l d !
  • 전개연산자(…) : done이 true가 될 때까지 값을 펼쳐줌
  • yield* 옆자리에는 반복 가능한 모든 객체가 올 수 있음

정리

generator는 다른 작업을 하다가 다시 돌아와서 next() 해주면 진행이 멈췄던 부분부터 이어서 실행한다.

profile
잡생각 많은 인간

0개의 댓글