【发布时间】:2014-06-30 02:03:49
【问题描述】:
我了解了 ES6 的特性,而生成器引起了我的注意。 想到的一件事是链接 Promise 对象,这是我无法用循环做的。还有哪些我们以前做不到的机制?
我确实理解这是一个宽泛的问题,但目前我除了 Promises 之外什么都想不到。
【问题讨论】:
标签: javascript generator ecmascript-harmony ecmascript-6
我了解了 ES6 的特性,而生成器引起了我的注意。 想到的一件事是链接 Promise 对象,这是我无法用循环做的。还有哪些我们以前做不到的机制?
我确实理解这是一个宽泛的问题,但目前我除了 Promises 之外什么都想不到。
【问题讨论】:
标签: javascript generator ecmascript-harmony ecmascript-6
通过使用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* docs。有点像for (let x of traverseTree(node.left)) yield x;的快捷方式