JS Lambda与async.parallel调用范围
我无法从其外部范围捕获一个variables到lambda函数。 当我运行这个代码时,它使用相同的variables执行。 我将这个variables传递给函数,但是我显然误解了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; });
你可以包装外层function:
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
作为parameter passing并绑定它:
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));
基本上我可以看到两个错误:
- 你正在重新声明variables我在循环里面。 命名有所不同。
-
创build像这样的闭包:
Var task =(function(i){return function(task_callback){// Your logic};})(i);
希望它会有所帮助。
很难理解你在这里调用lambda,但是如果你想在async中绑定上下文,你需要在方法中使用方法的每一个或者一个新的数组方法。 看看文档