为什么node.js生成器没有按预期工作?

时间:2016-06-26 08:30:09

标签: javascript node.js promise generator co

鉴于以下两个代码片段,为什么事务对象在工作案例中可见但在另一个案例中不可见?

工作案例:

return db.transaction(function(transaction) {
  return co(function*() {
    // transaction is visible, do something with it -> works
  }
}

不工作案例:

var c = co(function*() {
   // transaction is NOT visible -> does not work!
});

return db.transaction(function(transaction) {
  return c;
});

是否可以在第二种情况下使交易可见?

2 个答案:

答案 0 :(得分:3)

  

为什么交易对象在工作案例中可见但在另一种情况下不可见?

闭包。当函数对象创建时,它只捕获周围范围内的所有变量。在第一种情况下,当创建生成器函数时,它在周围范围内有一个名为transaction的变量。因此,当实际调用它时,范围内可以使用transaction

但在第二种情况下,当创建生成器函数时,transaction不可用。

要解决此问题,您需要显式传递transaction对象。也许是这样的

function c(transaction) {
  return co(function*() {
    // transaction will be available now
  });
}

return db.transaction(function(transaction) {
  return c(transaction);
});

答案 1 :(得分:0)

这是因为函数范围的工作原理。在工作示例中,如果transaction函数的范围及其中的所有回调和函数,db.transaction是一个可见变量。但是,当您在db.transaction范围之外定义生成器函数时,生成器函数只能访问其自己的变量以及父范围中的任何变量。

您可以在此处找到有关javascript中函数范围的更多信息,例如:http://ryanmorr.com/understanding-scope-and-context-in-javascript/