JavaScript: 생성기란 무엇입니까(수율)

우선, yield는 도대체 무엇을 의미합니까? 영어가 모국어가 아닌 저로서는 매우 혼란스럽습니다. 따라서 Cambridge DictionaryMacmillan dictionary 에 따라 수율은 다음과 같습니다.

To produce something useful such as information or evidence

"Knowing about our past does not automatically yield solutions to our current problems.
yield results/benefits: The search for truth is beginning to yield fruitful results.
"

"A letter found by the FBI last week may yield new clues."



이제 단어의 의미를 알았으므로 JavaScript에 대해 이야기해 보겠습니다.

제너레이터는 실행을 중간에 중지하고 일정 시간이 지나면 중지된 동일한 지점에서 다시 시작할 수 있는 일종의 특수 기능입니다. 기본적으로 functionsiterators 의 조합입니다.

생성기를 호출하면 객체{value: value, done: true|false}를 반환합니다. 여기서 value는 산출할 값이고 done은 .next() 함수가 값을 산출하거나 정의되지 않은 경우 생성기에 알려주는 부울입니다.

생성기 함수를 생성하려면 *를 사용해야 합니다.

function* generator(i){ ... }

* JavaScript에 iterator 객체가 반환될 것임을 알리고 일반 함수와 달리 실행을 바로 시작하지 않기 때문입니다.

제너레이터 함수를 사용하는 방법을 살펴보겠습니다.

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

const generate = generator(15);

console.log(generate.next()); // {value: 25, done: false}
console.log(generate.next()); // {value: 35, done: false}
console.log(generate.next()); // {value: 65, done: false}
console.log(generate.next()); // {value: undefined, done: true}

next() 함수를 호출하면 실행이 시작됩니다. 첫 번째yield 문을 찾을 때까지 실행하고 값을 산출합니다. 다시 호출되면 next()는 다음 yield 문을 찾을 때까지 생성기 함수를 재개하고 이 주기는 더 이상 yields 가 없을 때 종료되고 {value: undefined, done: true} 로 끝납니다.

제너레이터의 return 문은 done 이후의 true 속성yields 및 기타 모든 return 설정은 undefined가 됩니다.

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

const generate = generator(15);

console.log(generate.next()); // {value: 25, done: false}
console.log(generate.next()); // {value: 35, done: false}
console.log(generate.next()); // {value: undefined, done: true}


오류가 발생하는 경우에도 동일하게 적용됩니다. 다음yields은 모두 undefined 입니다.
yield*를 사용하여 다른 생성기 함수를 생성할 수도 있습니다.

function* func1() {
  yield 73;
}

function* func2() {
  yield* func1();
}

const iterator = func2();

console.log(iterator.next()) // {value: 73, done: false}
console.log(iterator.next()) // {value: undefined, done: true}


장점



  • 지연 로딩: 필요할 때만 값을 평가합니다.

  • 메모리 효율성: 필요할 때만 값을 평가하므로 해당 값을 저장하는 데 필요한 메모리가 줄어듭니다.

  • 위험


  • 생성기는 배열 및 기타 데이터 구조와 같은 임의 액세스를 제공하지 않습니다.
  • 생성기는 일회성 액세스를 제공합니다. 따라서 값을 다시 반복할 수 없습니다.

  • 발전기를 사용하는 이유



    솔직히 내 자신의 코드에 대한 사용 사례를 찾지 못했습니다. 인터넷을 검색하다가 dev에 대한 흥미로운 기사를 찾았습니다: .

    JavaScript 생성기를 사용하여 API 최적화



    IROEGBU! 생성기를 사용하여 API를 최적화하는 방법에 대한 놀라운 게시물을 작성했습니다. 확인할 수 있습니다here.

    출처


  • MDN
  • freeCodeCamp
  • 좋은 웹페이지 즐겨찾기