2013-04-29 2 views
4
을 보존

다음과 같은 코드가있는 경우 :비동기 - 변수를 전달하고 상황에 맞는

var asyncConfig = {}; 
var a, b; 
for(var i = 0; i < someValue; i++) { 
    // do something with a 
    // do something with b 
    asyncConfig[i] = function(callback) { 
     func(a, b, callback); // func is async 
    } 
} 
// Include some more parallel or series functions to asyncConfig 
async.auto(asyncConfig); 
  • 어떻게 당신이 변수의 값 afunc-b 그래서 async.auto(asyncConfig)for 루프 후에 실행 될 때를 전달할 수를 , ab의 컨텍스트가 보존됩니까?

(func의 모든 실행을위한 ab의 다른 컨텍스트.)

사전에 감사합니다! bind를 사용

+2

[자바 스크립트 클로저 내부 루프 - 간단한 실제 예] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) –

답변

7
var asyncConfig = {}; 
var a, b; 
for(var i = 0; i < someValue; i++) { 
    // do something with a 
    // do something with b 
    (function(a,b){ 
     asyncConfig[i] = function(callback) { 
     func(a, b, callback); // func is async 
     } 
    })(a,b); 
} 
// Include some more parallel or series functions to asyncConfig 
async.auto(asyncConfig); 
+1

매우 빠른 것을 가져 주셔서 감사합니다 그리고 명확한 대답! –

+0

다른 사람이 우리가이 일을해야한다는 것이 터무니없는 것이라고 생각합니까? 내가 원하는 건 내 현재 상태의 일부를이 임무 집행자에게 넘기는 것이다. coffeescript에서 내 코드는 다음과 같습니다 : '_metadata = do (metadata) -> (콜백) -> callback (null, metadata); async.auto (metadata : _metadata) ' 앞으로이 해결 방법을 사용하면 일부 주요 버그가 나타날 것입니다. – owensmartin

+0

'''myFunction.bind (null, a, b)'''를 사용할 수도 있습니다. –

1

가능한 대안 :

var asyncConfig = {}; 
var a, b; 
for(var i = 0; i < someValue; i++) { 
    // do something with a 
    // do something with b 
    asyncConfig[i] = func.bind(asyncConfig, a, b); 
} 
// Include some more parallel or series functions to asyncConfig 
async.auto(asyncConfig); 

는이 지원 바인드를 사용하는 환경에 있는지 확인해야합니다. 또한 "this"값을 asyncConfig으로 바인딩하고 있는데, 이는 적합하지 않을 수 있습니다.

편집 : 질문을 다시 읽고, a 및 b 프리미티브 또는 객체/배열입니까? 만약 그들이 프리미티브가 아니라면, 당신은 그들을 복제하고 싶을 것이다.