2016-09-19 2 views
1

변수를 람다 함수의 외부 범위에서 캡처 할 수 없습니다. 이 코드를 실행하면 같은 변수로 실행됩니다. 함수에 변수를 전달하고 있지만 람다에서 범위 지정이 작동하는 방식을 오해하고 있습니다. 내가 볼 수JS Lambda 범위 지정 async.parallel 호출

// 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의 람다 (Fat 화살표 구문)는'async.parellel (async_tasks, (err, results) => {fCallback (null, user); return;})과 같을 것입니다. ' –

답변

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을 통과하고 바인딩 비동기에서 컨텍스트를 바인딩하려면 프레임 워크의 새 배열 메서드 중 하나 또는 각 메서드를 사용해야합니다. Have a look to docs

+0

고마워요! 첫 번째 옵션은 완벽하게 작동했습니다. – Michael

0

기본적으로 두 개의 실수 :

  1. 당신은 내가 루프 내부 변수를-선언을 다시한다. 이름을 다른 것으로 지정하십시오.
  2. 이 같은 폐쇄 뭔가 만들기 :

    바르 작업 = (기능 (I) { 리턴 기능 (task_callback) { // 당신의 논리 }; }) (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)); 
0

그것은 당신이 여기 람다를 호출 정확히 이해하기 어렵지만 :