Generator and yield

개요

Generator?

관련 파일

async 함수와의 관계?

문법

function* generator(i) {
  yield i;
  yield i + 10;
}

const gen = generator(10); // generator는 constructor(즉 new 키워드)로 생성되지 않는다

console.log(gen.next().value);
// expected output: 10

console.log(gen.next().value);
// expected output: 20

yield의 동작 방식?

터미널 입력 계속 받기

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator

import readline from "readline";

async function* questions() {
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
  });
  let query;
  try {
    while (true) {
      query = yield new Promise((resolve) => {
        if (query) {
          rl.question(query, resolve); // readline으로 입력된 값을 resolve해서 반환
        } else {
          resolve(null); // 처음 yield로 이동 시(generator.next();)에 query가 비어 있으므로 null로 resolve
        }
      });
    }
  } finally {
    rl.close();
  }
}

async function run() {
  let loopCnt = 0;
  const generator = questions();
  // Generator 오브젝트 생성 시 초기 파라미터를 넘기는 경우와 넘기지 않는 경우가 있다
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*#passing_arguments_into_generators
  generator.next(); // 초기 파라미터 넘기지 않으면, `next()`사용해서 초기 yield까지 한번 이동하게 해야 한다
  let generated = await generator.next(`${loopCnt++}번째 질문\n`);
  console.log("Outside of while, first generated", generated);
  while (generated.done === false) {
    generated = await generator.next(`${loopCnt++}번째 질문\n`);
    console.log("Inside of while", generated);
    if (loopCnt == 3) {
      generator.return();
      break;
    }
  }
}

run();
/*
0번째 질문
안녕
Outside of while, first generated { value: '안녕', done: false }
1번째 질문
Hello
Inside of while { value: 'Hello', done: false }
2번째 질문
World
Inside of while { value: 'World', done: false }
*/

기타

참고 링크