我了解了 ES6 的特性,而 Generators 引起了我的注意。我想到的一件事是链接 Promise 对象,而我无法用循环来做。我们将能够做哪些其他机制,而我们以前无法做到?
我确实理解这是一个广泛的问题,但目前除了 Promises 之外我想不出其他任何东西。
我了解了 ES6 的特性,而 Generators 引起了我的注意。我想到的一件事是链接 Promise 对象,而我无法用循环来做。我们将能够做哪些其他机制,而我们以前无法做到?
我确实理解这是一个广泛的问题,但目前除了 Promises 之外我想不出其他任何东西。
通过使用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();
        }
    }
}