我正在尝试在Javascript中实现生成器并尝试确定我的生成器是否已完成。
那里有很多相互矛盾的信息(我想这是因为这仍然是一个新功能)。无论如何,我在Java中使用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'成员的对象,但我得到'未定义'而不是。
我可以捕获在生成器完成后调用next()时抛出的异常,但这似乎不太优雅。我还想更明确地将它放在for()子句中并让Javascript为我做检查。
有没有更好的方法来检查我的发电机何时完成?
答案 0 :(得分:3)
function*
是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