为什么 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/
给定以下两个代码片段,为什么交易对象在工作案例中可见而在其他案例中不可见?
工作案例:
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/