在阅读了MDN上关于生成器的文档后,我想出了这个简单的实验:
var nodes = {
type: 'root',
value: [
{ type: 'char', value: 'a' },
{ type: 'char', value: 'b' },
{ type: 'char', value: 'c' },
],
};
function* recursiveGenerator(node) {
if (node.type === 'root') {
node.value.forEach(function (subnode) {
for (var suffix of recursiveGenerator(subnode)) {
yield suffix;
}
});
}
else {
yield node.value;
}
}
for (generated of recursiveGenerator(nodes)) {
console.log(generated);
}
在使用--harmony
标志的node.js v0.11.9上运行它会产生以下错误:
alix@900X4C:~$ node --version
v0.11.9
alix@900X4C:~$ node --harmony test.js
/home/alix/test.js:14
yield suffix;
^^^^^^
SyntaxError: Unexpected identifier
我还尝试使用for ... in ...
和let
关键字代替var
,但没有任何成功。
我不明白yield*
确切的作用是什么, 但如果我在for
循环中使用它,我得到的结果是:
alix@900X4C:~$ node --harmony test.js
/home/alix/test.js:14
yield* suffix;
^
ReferenceError: yield is not defined
如果我用
console.log()
替换for循环中的yield,则会输出a
、b
和c
。我做错了什么?
编辑
这是一个极简的生成器,展示了node.js知道如何处理生成器:
function* alpha() {
yield 'a';
yield 'b';
yield 'c';
}
for (var suffix of alpha()) {
console.log(suffix);
}
输出:
alix@900X4C:~$ node --harmony y.js
a
b
c
解决方案(感谢@Andrew)
function* recursiveGenerator(node) {
if (node.type === 'root') {
for (var i = 0; i < node.value.length; ++i) {
var subnode = node.value[i];
for (var suffix of recursiveGenerator(subnode)) {
yield suffix;
}
}
}
else {
yield node.value;
}
}
for (generated of recursiveGenerator(nodes)) {
console.log(generated);
}
*
有点困惑。这些实际上在你的代码中吗?它们似乎不是你链接的规范的一部分。 - Chris Hayesyield*
的情况下,从错误信息来看,我认为 Node.js 期望yield
是一个变量名。在这两种情况下,它似乎都没有被识别为关键字。 - Chris Hayes--harmony
ж Үеҝ—гҖӮй—®йўҳжҳҜпјҢдёәд»Җд№ҲеҸӘжңүвҖңз®ҖеҚ•вҖқзҡ„з”ҹжҲҗеҷЁе‘ўпјҹ - Alix AxelforEach()
。它会创建自己的作用域(就像setTimeout()
一样)。如果你将其更改为for (var i = 0; i < node.value.length; i++)
,你应该能看到它正常工作。 - Andrewyield
来说还为时过早。 - Chris Hayes