我深入了解了 ES6 功能,Generators 引起了我的注意。
我突然想到的一件事是链接 Promise 对象,而我无法使用循环来做到这一点。我们还能做哪些以前做不到的其他机制?
我确实明白这是一个广泛的问题,但目前我除了承诺之外什么也想不到。
通过使用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();
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)