JS Lambda作用域使用async.并行调用



我无法从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。
  1. 像这样创建闭包:

    Var task = (function(i) {返回函数(task_callback) {//你的逻辑};}) (i);

希望对你有帮助。

很难理解你在这里调用lambda到底是什么,但是如果你想在异步中绑定上下文,你需要使用方法each或框架的新数组方法之一。看一下docs

最新更新