我们可以用ES6 Generator做什么,我们不能用for循环? [英] What can we do with ES6 Generator that we cannot with for loop?
问题描述
有一件事是引人注目的是链接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屋!