【问题标题】:What can we do with ES6 Generator that we cannot with for loop?我们可以用 ES6 生成器做什么,而我们不能用 for 循环?
【发布时间】:2014-06-30 02:03:49
【问题描述】:

我了解了 ES6 的特性,而生成器引起了我的注意。 想到的一件事是链接 Promise 对象,这是我无法用循环做的。还有哪些我们以前做不到的机制?

我确实理解这是一个宽泛的问题,但目前我除了 Promises 之外什么都想不到。

【问题讨论】:

    标签: javascript generator ecmascript-harmony ecmascript-6


    【解决方案1】:

    通过使用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();
            }
        }
    }
    

    【讨论】:

    • 您能否添加代码示例,如果我需要获取状态,我通常使用选项对象,我将其传递给每个并发调用自身,这会有什么不同?
    • 生成器根本不需要这些选项对象。它们只是成为生成器范围内的变量。
    • 这个例子更有意义,但是我很难理解你在第一个生成器函数中调用两次的 yield* 的概念。你能更详细地解释一下它的作用吗?非常感谢。
    • @Grimbode:看看delegated yieldMDN yield* docs。有点像for (let x of traverseTree(node.left)) yield x;的快捷方式
    猜你喜欢
    • 2023-03-13
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    相关资源
    最近更新 更多