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

Why is node.js generator not working as expected?

给定以下两个代码片段,为什么交易对象在工作案例中可见而在其他案例中不可见?

工作案例:

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;
});

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

why is the transaction object visible in the working case but not visible in the other case?

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

但是第二种情况,生成器函数创建时,transaction不可用


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

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

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

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

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