javascript - 语法错误 : Unexpected Identifier (Generators in ES6)

标签 javascript node.js generator yield ecmascript-harmony

我在阅读 documentation on generators from 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,但没有任何成功。

我不明白 what yield* does exactly ,但如果我在 for 循环中使用它,我会得到:

alix@900X4C:~$ node --harmony test.js 

/home/alix/test.js:14
                yield* suffix;
                ^
ReferenceError: yield is not defined

如果我用 console.log() 替换 for 中的 yield,它会输出 abc。我做错了什么?


编辑

这是一个简约的生成器,表明 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);
}

最佳答案

总结评论:你不能在 regular 函数中使用 yield,所以你不能在 中使用 yield对于每个。这里是“生成”foreach 的示例:

function * foreach (arr, fn) {
  var i

  for (i = 0; i < arr.length; i++) {
    yield * fn(arr[i])
  }
}

function * gen (number) {
  yield number + 1
  yield number + 2
  yield number + 3
}

function * other () {
  yield * foreach([1, 2, 3], gen)
}

for (var i of other()) {
    console.log(i)
}

更新 使用这样的助手也可以非常优雅地解决原始问题:

var nodes = {
  type: 'root',
  value: [
    { type: 'char', value: 'a' },
    { type: 'char', value: 'b' },
    { type: 'root', value: [
        { type: 'char', value: 'c' },
        { type: 'char', value: 'd' },
        { type: 'char', value: 'e' },
      ] 
    },
  ],
}

function * foreach (arr, fn) {
  var i

  for (i = 0; i < arr.length; i++) {
    yield * fn(arr[i])
  }
}

function * value (val) {
  yield val
}

function * recursiveGenerator(node) {
  yield * node.type === 'root' ?  foreach(node.value, recursiveGenerator) : value(node.value)
}

for (var generated of recursiveGenerator(nodes)) {
  console.log(generated);
}

所以生成器本身就变成了单行!

关于javascript - 语法错误 : Unexpected Identifier (Generators in ES6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20834113/

相关文章:

javascript - 如何在初始化后在 slick-slider 中添加另一个图像元素

javascript - SVG 线条无法正确渲染

javascript - 查询mysql数据库时出现ETIMEDOUT错误

node.js - 在哪里可以找到所有正在运行的pm2应用程序的端口?

python - Keras:正确使用 fit_generator、predict_generator 和 evaluate_generator

javascript - 如何使用 jquery 对 HTML 内容进行动画处理。

javascript - phonegap 在 "resume"上崩溃

Android 连接 Node.js REST 流意外结束

python - 如何使用 spaCy 处理 python 生成器的异常

indexing - 如何从 Julia 的生成器中获取前 N 个元素