ES6 새로운 기능의 Generator

4548 단어 es6generator

1: 기본 개념


실제로Generator는 트랙터의 생성기입니다. 우리는Generator로 트랙터를 생성할 수 있습니다.Generator는 두 가지 뚜렷한 특징이 있다. 첫 번째는function 키워드와 함수 이름 사이에 별표가 있는데 일반적으로 둘을 함께 쓴다.두 번째는 함수 체내에 yield의 키워드가 있다는 것이다.
    function* generator(){
        yield 1;
        yield 2;
        return 3;  //return next , Generator 
    }
    const firstGenerator = generator();
    //
    firstGenerator.next()
    { value: 1, done: false }
    firstGenerator.next()
    { value: 2, done: false }
    firstGenerator.next()
    { value: 3, done: true }
    firstGenerator.next()
    { value: undefined, done: true }
    firstGenerator.next()
    { value: undefined, done: true }

2: 프로세스 수행


Generator 함수를 호출한 후에 실행하지 않습니다. 첫 번째 호출은 실행하지 않습니다.next를 호출할 때만 진정으로 실행됩니다.
    function* generator(){
        console.log(1);
        yield 1;
        console.log(2);
        yield 2;
        console.log(3)
        return 3;
        console.log(4);
    }
    const gen = generator();

다음 상태로 바늘을 이동하기 위해next 방법을 호출합니다
    function* generator(){
        console.log(1);
        yield 1;
        console.log(2);
        yield 2;
        console.log(3)
        return 3;
        console.log(4);
    }
    const gen = generator();
    gen.next();
    
    // 1
       { value: 1, done: false }

yield 또는return 문장까지 실행하면 next마다 다음 yield까지만 가거나 return으로 바로 넘어갈 수 있습니다.
    function* generator() {
      console.log(1);
      yield 1;
      console.log(2);
      yield 2;
      console.log(3);
      return 3;
      console.log(4);
    }
    const g = generator();
    g.next();
    g.next();
    
    // 1
       2
       { value: 2, done: false }

next가 실행될 때,return,return은 next를 종료하는 표지판입니다.
    function* generator() {
      console.log(1);
      yield 1;
      console.log(2);
      yield 2;
      console.log(3);
      return 3;
      console.log(4);
    }
    
    const g = generator();
    g.next();
    g.next();
    g.next();
    g.next();
    
    // 1
       2
       3
       { value: undefined, done: true }

3: Generator 방법

  • next, 만약에 매개 변수가 이전 yield 표현식의 반환값으로 간주된다면next는 매개 변수를 전달할 수 있다는 것을 설명합니다. 만약에 전달되지 않았을 때undefined..
    function* generator(x) {
      var y = 3 * (yield (x + 3));
      var z = yield (y / 2);
      return (x + y + z) * 2;
    }
    
    const gen1 = generator();
    
    
    // gen1.next(); 
       { value: NaN, done: false } 
       gen1.next();
       { value: NaN, done: false } */
       gen1.next();
       { value: NaN, done: false } */
       gen1.next();
       { value: undefined, done: true }
    function* generator(x) {
      var y = 3 * (yield (x + 3));
      var z = yield (y / 2);
      return (x + y + z) * 2;
    }
    
    const gen2 = generator(10);
    gen2.next();
    // { value: 13, done: false } 
    /*
    x = 10
    13 = 10 + 3
    */
    
    gen2.next(10);
    // { value: 15, done: false }
    /*
    y = 30
    15 = 3 * 10 / 2
    */
    
    gen2.next(10);
    // { value: 100, done: false }
    /*
    z = 10
    100 = (10 + 10 + 30) * 2
    */
  • throw, 함수 밖으로 오류가Generator 함수에서 포획되었습니다
    function* generator(x) {
      try {
        yield;
      } catch (err) {
        console.log('inner error', err);
      }
    }
    
    const g = generator();
    g.next();
    // { value: undefined, done: false }
    
    g.throw(new Error('123'))
    // inner error Error: 123
  • return, 현재Generator 함수 종료..

  • 4: Generator 함수 적용

  • yield*, Generator 함수 내부에서 다른 Generator 함수를 호출합니다. 수동으로 반복할 필요가 없습니다..
    function* generator1(){
      yield* [1, 2, 3];
    }
    generator1().next();
    // { value: 1, done: false } 
    
    function* generator2(){
      for (var value of [1, 2, 3]) {
        yield value;
      }
    }
    generator2().next();
    // { value: 1, done: false } 
    
    function* generator3(){
      yield [1, 2, 3];
    }
    generator3().next();
    // { value: Array(3), done: false }

  • 5:Generator 함수 적용

  • for of,return 전의 데이터를 두루 훑어본다
    function* generator() {
      yield 1;
      yield 2;
      yield 3;
      return 4;
    }
    
    for (let s of generator()) {
      console.log(s);
    }
    //  1
        2
        3
  • 상태기
    const status = function* () {
      while (true) {
        console.log('On');
        yield true;
        console.log('Off');
        yield false;
      }
    }();
    status.next();
    
    // On
       {value: true, done: false}
  • 네트워크 요청
    import axios from 'axios';
    
    function* generator(){
      const url = 'https://xxx.xxx.com';
      const result = yield fetch(url);
      return result();
    }
  • 비동기식 파일 흐름 조작
  • 좋은 웹페이지 즐겨찾기