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

Mat*_*ius 5 javascript generator ecmascript-harmony ecmascript-6

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

我明白这是一个广泛的问题,但我现在还想不出什么,只有承诺.

Ber*_*rgi 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Grimbode:看看[委托产量](http://stackoverflow.com/q/17491779/1048572)或[MDN`product*`docs](https://developer.mozilla.org/en-US/文档/网络/的JavaScript /参考/运营/产量*).它有点像`for(让x of traverseTree(node.left))产生x的快捷方式; (3认同)