JS Lambda使用async.parallel调用作用域

时间:2016-09-19 17:03:31

标签: node.js asynchronous

我无法从外部范围将变量捕获到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;

  });

3 个答案:

答案 0 :(得分:1)

你可以包装外部函数:

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

答案 1 :(得分:0)

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

  1. 你在for循环中重新声明变量i。把它命名为不同的东西。
  2. 创建这样的闭包:

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

  3. 希望它能提供帮助。

答案 2 :(得分:0)

很难理解你究竟在这里调用lambda,但是如果你想在异步中绑定上下文,你需要使用方法中的每一个或一个新的数组方法。 Have a look to docs