我们可以用ES6 Generator做什么,我们不能用for循环? [英] What can we do with ES6 Generator that we cannot with for loop?

查看:106
本文介绍了我们可以用ES6 Generator做什么,我们不能用for循环?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我去了ES6功能,发电机抓住了我的眼睛。
有一件事是引人注目的是链接Promise对象,我不能用循环。我们可以做什么其他的机制呢,我们以前不能这样做?



我明白这是一个广泛的问题,

解决方案

通过使用 yield ,发电机可以暂停您的功能的控制流程中的任何一点,可以节省您当前的执行状态(范围和堆栈)。



没有生成器,这更复杂:




  • 你需要明确地跟踪状态

  • 分支,(特别是)循环控制结构需要被表示以递归的方式递交。



生成器对于遍历数据结构是通用的,创建一个简单的流式迭代器,产生所有元素顺序。想想树遍历,或图表中的DFS / BFS,以简单的例子。

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

// vs(不确定):
函数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();
}
}
}


I went trough ES6 features and Generators caught my eye. One thing that sprang to mind is chaining Promise objects, that I could not do with loops. What other mechanics we will be able to do, that we could not before?

I do understand this is broad question, still I can't think of anything but Promises at the moment.

解决方案

By using yield, generators can be suspended at any point in the control flow of your function, saving your current state of execution (scope & stack).

Without generators, this is more complicated:

  • you need to explicitly keep track of the state
  • branching and (especially) looping control structures need to be represented in a functional way, i.e. written recursively.

Generators are generically useful for traversing data structures, creating a simple stream-like iterator that yields all elements in order. Think of tree traversal, or DFS/BFS in graphs for simple examples.

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();
        }
    }
}

这篇关于我们可以用ES6 Generator做什么,我们不能用for循环?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆