如何检查Javascript生成器是否退出?

时间:2014-11-18 11:49:16

标签: javascript generator rhino coroutine

我正在尝试在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为我做检查。

有没有更好的方法来检查我的发电机何时完成?

1 个答案:

答案 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