我们可以用ES6 Generator做什么,我们不能用于循环?

时间:2014-05-12 15:56:31

标签: javascript generator ecmascript-harmony ecmascript-6

我通过ES6功能和发电机引起了我的注意。 出现在脑海中的一件事是链接Promise对象,我不能用循环来做。我们能做什么其他机制,我们以前不能做到?

我确实理解这是一个广泛的问题,但我现在还无法想到除了Promise之外的一切。

1 个答案:

答案 0 :(得分:7)

通过使用yield,可以在函数控制流中的任何位置暂停生成器,从而保存当前的执行状态(范围和堆栈)。

没有发电机,这更复杂:

  • 您需要明确跟踪状态
  • 分支和(特别是)循环控制结构需要以功能方式表示,即递归写入。

生成器通常用于遍历数据结构,创建一个简单的流式迭代器,按顺序生成所有元素。考虑树遍历,或图中的DFS / BFS以获取简单示例。

function* traverseTree(node) {
    if (node == null) return;
    yield* traverseTree(node.left);
    yield node.value;
    yield* traverseTree(node.right);
}

// vs (not sure):
function traverseTree(node) {
    var rl, l, r;
    return {
        next: function() {
            if (node == null && !r) return {done:true};
            if (!l) l = traverseTree(node.left);
            if (!(rl=l.next()).done)
                return rl;
            if (node != null) {
                var n = {value:node.value};
                node = null;
                r = traverseTree(node.right);
                return n;
            }
            return r.next();
        }
    }
}