#17. Generator

Seulyi Yoo·2022년 7월 11일
0

javascript grammar

목록 보기
17/20
post-thumbnail

함수의 실행을 중간에 멈췄다가 재개할 수 있는 기능
다른 작업을 하다가 다시 돌아와서 next() 해주면 진행이 멈췄던 부분부터 이어서 실행
ex) Redux Saga


function* fn(){
  yield 1;
  yield 2;
  yield 3;
  return "FINISH";
}

const a = fn();

console.log(a); // Generator { }
function* fn(){
  console.log(1);
  yield 1;
  console.log(2);
  yield 2;
  console.log(3);
  console.log(4);
  yield 3;
  return "FINISH";
}

const a = fn();



next(), return(), throw()

function* fn(){
  try {
    console.log(1);
    yield 1;
    console.log(2);
    yield 2;
    console.log(3);
    console.log(4);
    yield 3;
    return "FINISH";
  } catch (e) {
    console.log(e)
  }
}

const a = fn();



iterable (반복이 가능)

  • Symbole.iterator 메서드가 있다
  • Symbole.iterator는 iterator 를 반환해야 한다.

iterator

  • next 메서드를 가진다
  • next 메서드는 value 와 done 속성을 가진 객체를 반환한다.
  • 작업이 끝나면 done 은 true 가 된다.
function* fn() {
  yield 4;
  yield 5;
  yield 6;
}

const a = fn();




next() 에 인수 전달

function* fn() {
  const num1 = yield "첫번째 숫자를 입력해주세요.";
  console.log(num1);
  
  const num2 = yield "두번째 숫자를 입력해주세요.";
  console.log(num2);

  return num1 + num2;
}

const a = fn();


값을 미리 만들어 두지 않음

function* fn() {
  let index = 0;
  while(true) {
    yield index++;
  }
}

const a = fn();


yield* 을 이용

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

function* gen2() {
  yield "Hello,";
  yield* gen1();
  yield  "!";
}

profile
성장하는 개발자 유슬이 입니다!

0개의 댓글