我无法从lambda函数的外部作用域捕获变量。当我运行这段代码时,它以相同的变量执行。我正在将变量传递给函数,但我显然误解了lambda的作用域是如何工作的。
// Add tasks to async_tasks
for(var i = 0; i < 10; i++){
var task = function(task_callback){
// I want to capture i and pass it to the function
(function(i){
exports.defaultCarWithId(connection, i, function(err, data){
if (err) {
console.log('error in query: ' + err.stack);
fCallback("[Internal Server Error]", null);
return;
}
task_callback();
});
})(i);
};
async_tasks.push(task);
}
// execute tasks
async.parallel(async_tasks, function(err, results){
fCallback(null, user);
return;
});
你可以包装外部函数:
var task = (function(i){
return function(task_callback){
exports.defaultCarWithId(connection, i, function(err, data){
if (err) {
console.log('error in query: ' + err.stack);
fCallback("[Internal Server Error]", null);
return;
}
task_callback();
});
};
})(i);
async_tasks.push(task);
或传递i
作为参数并绑定它:
var task = function(i, task_callback){
exports.defaultCarWithId(connection, i, function(err, data){
if (err) {
console.log('error in query: ' + err.stack);
fCallback("[Internal Server Error]", null);
return;
}
task_callback();
});
};
async_tasks.push(task.bind(null, i));
我可以看到两个基本错误:
- 你在for循环中重新声明变量i。
像这样创建闭包:
Var task = (function(i) {返回函数(task_callback) {//你的逻辑};}) (i);
希望对你有帮助。
很难理解你在这里调用lambda到底是什么,但是如果你想在异步中绑定上下文,你需要使用方法each或框架的新数组方法之一。看一下docs