2014-11-18 3 views
1

자바에서 생성기를 구현하고 제너레이터가 완료되었는지 확인하려고합니다.Javascript 생성기가 종료되었는지 확인하는 방법은 무엇입니까?

많은 상충되는 정보가 있습니다 (아직 새로운 기능이므로). 어쨌든, 나는 자바에서 Rhino 1.7 릴리스 4를 사용하여 이것을 실행하고 있습니다.

function poem(foo) 
{ 
    console.println("I think that I shall never see"); 
    var a = yield(foo); 
    console.println("A poem as lovely as a tree"); 
    var b = yield(foo); 
    console.println("And so I pushed it into the sea"); 
    var c = yield(foo); 
    console.println("Hee hee hee hee"); 
} 

var gen = poem(); 

gen.next(); 
console.println("is done " + gen.next(5).done); 

이것은 MDN에 공식 문서 및 기타 다양한 웹 사이트에서 다른 :이 작동하는 것 같다 구문입니다. ('function *'키워드는 작동하지 않는 것으로 보이고 yield는 괄호를 기대하는 것 같습니다.) next() 함수가 'value'및 'done'멤버가있는 객체를 반환하기를 기대했지만 ' undefined '를 사용합니다.

발전기가 완료된 후에 next()가 호출 될 때 throw되는 예외를 catch 할 수 있지만 이는 비 효과적으로 보입니다. 나는 또한 그것을 for() 절 안에 넣고 Javascript를 사용하여 나를 검사한다고 명시하는 것이 더 좋을 것이다.

발전기가 완료 될 때를 확인할 수있는 더 좋은 방법이 있습니까?

답변

3

은 최근 기능인 ECMAScript 6에 정의 된 생성기의 구문입니다.

Rhino 1.7은 고대이며 "생성자"도 지원하지만 구문은 비표준입니다 (그 당시에는 function* 구문이 존재하지 않았습니다!). 이 이전 구문에 대한 설명서는 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators#Generators.3A_a_better_way_to_build_Iterators에 있습니다. 이 오래된 생성기가 완료되면 StopIteration 예외가 발생합니다. 따라서 try-catch를 사용하여 발전기 종료를 감지해야합니다.

function legacyGenerator() { 
    yield 1; 
} 
var gen = legacyGenerator(); 
gen.next(); // 1 
gen.next(); // throws StopIteration 
+0

감사합니다. 자바에서 사용할 수있는 최신 자바 스크립트 엔진에 대한 제안 사항이 있습니까? 오라클의 SDK와 안드로이드의 Davlik 모두와 함께 작동하기를 바랍니다. – kitfox

+1

@kitfox Rhino 개발자는 [Nashorn] (https://en.wikipedia.org/wiki/Nashorn_%28JavaScript_engine%29)로 이동 했으므로이를 살펴볼 수 있습니다. 또 다른 옵션은 Google 크롬 및 Node.js, v8 : [jav8] (https://code.google.com/p/jav8/)에서 사용되는 것과 동일한 JS 엔진을 사용하는 것입니다. 나는이 중 하나에 대한 경험이 없기 때문에 그들이 정말로 당신의 기대에 부합하는지보아야 할 것입니다. –

관련 문제