4
我去了槽ES6功能和发电机引起了我的注意。 想到的一件事是链接Promise对象,我无法用循环来做。我们还能做什么其他机制,我们以前不能做?我们可以用ES6 Generator做什么,我们不能用for循环?
我明白这是一个广泛的问题,但我现在还无法想到除了Promises之外的任何东西。
我去了槽ES6功能和发电机引起了我的注意。 想到的一件事是链接Promise对象,我无法用循环来做。我们还能做什么其他机制,我们以前不能做?我们可以用ES6 Generator做什么,我们不能用for循环?
我明白这是一个广泛的问题,但我现在还无法想到除了Promises之外的任何东西。
通过使用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();
}
}
}
请问您是否可以添加代码示例,如果我需要获取状态,我通常使用选项对象,我将其传入每个并发调用自身,这将如何不同? –
你根本不需要那些具有生成器的选项对象。它们只是发生器范围内的变量。 – Bergi
这个例子更有意义,但是我很难理解yield *的概念,在第一个generator函数中调用两次。你能详细解释一下它的作用吗?非常感谢。 – rottenoats