2014-05-12 70 views

回答

7

通过使用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(); 
     } 
    } 
} 
+0

请问您是否可以添加代码示例,如果我需要获取状态,我通常使用选项对象,我将其传入每个并发调用自身,这将如何不同? –

+0

你根本不需要那些具有生成器的选项对象。它们只是发生器范围内的变量。 – Bergi

+0

这个例子更有意义,但是我很难理解yield *的概念,在第一个generator函数中调用两次。你能详细解释一下它的作用吗?非常感谢。 – rottenoats

相关问题