为什么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/