2016-11-07 1 views
1

Generator를 이해하려고 노력하지만, 따라 올 수없는 예제를 발견했습니다.Generator를 반홖하는 Generator를 반복하십시오.

// First Generator 
 

 
function* Colors() 
 
{ 
 
    yield "blue"; 
 
    yield* MoreColors(); 
 
    yield "green"; 
 
} 
 

 
// Generator refered by the first Generator 
 
function* MoreColors() 
 
{ 
 
    yield "yellow"; 
 
    yield "orange"; 
 
} 
 

 

 
// Let us iterate over the first Generator 
 

 
const colorIterator = Colors(); 
 

 
let color; 
 

 
while (!(color = colorIterator.next()).done) 
 
{ 
 
    console.log(color.value); 
 
}

출력은 다음과 같습니다 "파란색" "노란색" "오렌지" "녹색"

내가 기대 : "파란색" " 황색 " "주황색 "

내가 기대하는 이유

이 : 내가 오렌지가 반환 된 후, 방법 다음 내용은()MoreColors()에서 반복자에라고 생각합니다. 속성 이 의 경우 인 객체를 반환해야합니다. 이며이고 while 루프는 중지되어야합니다.

분명히, 나의 기대는 틀렸다.

내가 잘못한 것을 누군가 지적 할 수 있다면 기쁠 것입니다.

+2

'yield'는'done' 속성을 수정하지 않으면 꽤 쓸모가 없습니다; 첫 번째 위임 된 발전기가 완료 되 자마자 외부 발전기 보고서가 완료된다는 것을 의미합니다. – ShadowRanger

답변

1

문제는 MoreColors가 멈 추면 발전기 색상이 멈추지 않는다는 것입니다. MoreColors가 완료된 후 Colors의 실행은 중단 된 지점에서 계속되므로 완료되기 전에 "녹색"을 반환합니다. 왜냐하면 생성기가 MoreColors가 아닌 "대답"을 반환하고 .next() 메서드가 여전히 Colors에 호출되기 때문입니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 그러나 기술적으로 나는 아직도 무슨 일이 일어나고 있는지 이해하지 못합니다. 나는 당신의 대답을 정확하게 이해하고 있는가, Generator Colors가 스스로 책임지고, while-loop가 더 실행되는지 이해하고 있는가? – Jim

+0

예. yield *를 사용하고이를 적용한 생성기 (MoreColors)가 {done : true}를 반환하면 원래 생성자 (Colors)가이를 감지하고 해당 값을 반환하는 대신 다른 yield 문에 도달 할 때까지 실행을 계속합니다. 실행 – matanso

+1

matanso 및 @ShadowRanger : 지식을 공유해 주셔서 감사합니다! 너 나 많이 도와 줬어! – Jim

관련 문제