2016-09-19 2 views
1

ラムダ関数の変数をその外部スコープから取得できません。このコードを実行すると、同じ変数で実行されます。関数に変数を渡していますが、ラムダでどのようにスコープが動作するのか誤解しています。async.parallelコールのJS 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; 

    }); 
+0

ここにラムダ関数はありませんか? –

+1

@SterlingArcher私はそれを匿名関数と混同しているようですね。 – Michael

+0

そうかもしれません。 JS内のLambdas(Fatの矢印構文)は 'async.parellel(async_tasks、(err、results)=> {fCallback(null、user); return;}); ' –

答えて

1

あなたは外側の関数ラップすることができます:それはあなたがここにラムダを呼び出している正確に理解するのは難しいが、あなたがしたい場合は

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

ありがとう!最初のオプションは完全に機能しました。 – Michael

0

は基本的に私が見ることができる2つのミス:

  1. あなたはループのための変数の内部Iを再宣言しています。別の名前を付けてください。
  2. このような閉鎖何かを作成します。

    Varのタスクは=(関数(I){ リターン機能(task_callback){// あなたのロジック };} )(i)を、

希望します。

0

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を渡し、それをバインドします非同期でコンテキストをバインドするには、フレームワークの新しい配列メソッドのそれぞれまたは1つをメソッドとして使用する必要があります。 Have a look to docs