무슨... 발전기!

발전기에 대해 알고 싶습니까?

먼저 확인해야 할 사항



이것은 건너뛸 수 있는 것이 아닙니다. 제너레이터는 반복자를 통해 작동하기 때문입니다. 우리는 제너레이터가 우리 자신의 이터레이터를 작성하는 더 간단한 방법이라고 말할 수 있습니다.

이것은 생성기입니다.


function* breeds(){
    yield "labrador";
    return "chow-chow";
}

const iterator = breeds();

console.log(iterator.next())
//->{value: "labrador", done: false}
console.log(iterator.next())
//->{value: "chow-chow", done: true}
console.log(iterator.next())
//->{value: undefined, done: true}



여기서 무슨 일이 일어나는지 봅시다.

먼저 제너레이터 함수를 생성해야 하며 함수와 함수 이름 사이에 *를 사용하여 생성할 수 있습니다.
다음과 같은 경우:function* breeds()function *breeds()const breeds = function *()const breeds = function*()어쨌든 작동합니다!.

(단, 함수 바로 뒤에 *를 사용하는 것이 기본이니...항상 구문function*을 사용하도록 하세요.)

그 함수 안에서 우리는 yield를 사용하고 있습니다... 그게 뭐죠?
yield next() 호출을 듣는 것입니다.

반복자에서 .next()를 사용할 때마다 생성기는 아직 사용되지 않은 다음 yield를 사용합니다.
그것은 반복자 뒤에 있는 동일한 아이디어이며 반복자가 반환하는 완료 키를 사용하여 확인하고 있습니다!.

값이 false이면 .next()는 이전 값 이후에 yield를 호출합니다.


console.log(iterator.next())
//->{value: "labrador", done: false}
console.log(iterator.next())
//->{value: "chow-chow", done: true}
console.log(iterator.next())
//->{value: undefined, done: true}



done:true가 언제 발생합니까?
더 이상 그 발전기를 생산할 수 없을 때.

그러나 우리는 이것에 대해 더 정확할 필요가 있습니다.



우리 모두는 JS의 함수가 항상 무언가를 반환한다는 것을 알고 있습니다.
리턴을 정의하지 않으면 JS가 It 끝에 "정의되지 않음"을 리턴하여 대신 수행합니다.


function* breeds(){
    yield "labrador";
    yield "chow-chow";
}

const iterator = breeds();

console.log(iterator.next())
//->{value: "labrador", done: false}
console.log(iterator.next())
//->{value: "chow-chow", done: false}
console.log(iterator.next())
//->{value: undefined, done: true}



함수에서 반환을 제거하여 .next()를 호출하면 JS가 강제로 a를 반환합니다{value: undefined, done: true}.

따라서 JS는 생성기와 함께 여전히 It을 반환합니다. 여기서는 여전히 함수에 대해 이야기하고 있기 때문입니다!

강제로 반환하려면 반복자에서 .return() 메서드를 사용하고 생성기를 완료할 수 있습니다.


function* breeds(){
    yield "labrador";
    yield "chow-chow";
}

const iterator = breeds();

console.log(iterator.return("we <3 dogs"))
//->{value: "we <3 dogs", done: true}
console.log(iterator.next())
//->{value: undefined, done: true}
console.log(iterator.next())
//->{value: undefined, done: true}



보시다시피, 우리는 .return() 메서드로 제너레이터를 즉시 반환하고 마무리합니다!.

발전기는 마법이 아닙니다!



실제로 제너레이터를 호출하여 작업을 실행하는 것이 아닙니다. 실제로 .next() 메서드로 제너레이터를 호출할 때마다 반복자 인터페이스를 사용하고 있습니다.

.next()는 제너레이터 함수를 START(yield 호출) 및 PAUSE(done: 값 확인)하는 원격 컨트롤러로 볼 수 있습니다.

그렇기 때문에 다음을 정의해야 합니다.


const iterator = breeds();



iterator.next()를 호출합니다.

(iterator 반복자 객체 자체가 아니라 변수 이름일 뿐입니다)

많은 일을 할 수 있습니다



실생활에서 제너레이터로 정말 많은 일을 할 수 있습니다.

변수와 함께 생성기 값을 사용할 수 있습니다.
for...of 루프를 가져오고, 퍼뜨리고, 사용할 수 있습니다.

현재 우리는 제너레이터를 사용하여 한 번에 하나의 yield를 호출하고 있습니다. 동기 방식으로 It을 사용하고 있다고 말할 수 있습니다.

그러나 제너레이터는 비동기 방식으로도 사용할 수 있습니다.
지금은 다루지 않겠습니다... Promise 또는 async/await에 대해 확인할 수 있습니다. 아마 다른 날에 그것에 대해 이야기할 것입니다.
Promises
Async

코드와 함께 재미를

좋은 웹페이지 즐겨찾기