ES6 Generators

1807 단어

생성기 함수


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!";
}
  • 생성기 함수function*로 표시
  • 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 }
    

    생성기 함수를 실행할 때 함수는 즉시 실행되지 않습니다. 호출 next 방법은 다음 yield 문장으로 실행되고 yield의 값을 되돌려줍니다.
    모든 yield 실행이 완료되면 { value: undefined, done: true }

    생성기 함수는 교체기이다

    function* range(start, stop) {
      for (var i = start; i < stop; i++)
        yield i;
    }
    
    for (var value of range(0, 3)) {
      alert("Ding! at floor #" + value);
    }
    
  • 생성기 대상의 next 함수는 값을 전할 수 있으며, 전입된 값은 yield의 반환값
  • 으로
  • return 방법은 생성기 방법의 실행을 끝내지만, 생성기 방법에finally가 있다면finally
  • 를 실행합니다
  • throw방법은 ield방법에서 이상을 던진다
  • 생성기 대상의 return 방법이 호출되지 않고 회수되면finally는 실행되지 않습니다
  • yield*iterator의 모든 값을 되돌려줍니다.
    function* concat(iter1, iter2) {
      for (var value of iter1) {
        yield value;
      }
      for (var value of iter2) {
        yield value;
      }
    }
    

    다음은 다음과 같습니다.
    function* concat(iter1, iter2) {
      yield* iter1;
      yield* iter2;
    }
    

    좋은 웹페이지 즐겨찾기