为什么node.js生成器不能按预期工作?

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

工作案例:

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

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

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

闭包。 当创build一个函数对象时,它只是捕获周围范围内的所有variables。 在第一种情况下,当创build生成器函数时,在周围的作用域中有一个名为transaction的variables。 所以,当它被实际调用时, transaction在范围中是可用的。

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


要解决这个问题,你需要明确地传递transaction对象。 也许这样

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

这是因为函数作用域的工作原理。 在工作示例中,如果db.transaction函数的范围及其中的所有callback函数都是可见的,则该transaction是可见的。 但是,当您在db.transaction范围外定义生成器函数时,生成器函数只能访问其自己的variables以及父范围内的任何variables。

你可以在这里find关于函数范围的更多信息,例如: http : //ryanmorr.com/understanding-scope-and-context-in-javascript/