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

基本上我可以看到两个错误:

  1. 你正在重新声明variables我在循环里面。 命名有所不同。
  2. 创build像这样的闭包:

    Var task =(function(i){return function(task_callback){// Your logic};})(i);

希望它会有所帮助。

很难理解你在这里调用lambda,但是如果你想在async中绑定上下文,你需要在方法中使用方法的每一个或者一个新的数组方法。 看看文档