2012-07-23 3 views
2

일부 비동기 프로그래밍 개념을 고민하려고합니다.Node.JS/async for 루프, 중첩 콜백의 현재 반복

지금 당장 본질적으로 두 가지 기능이 있습니다. 당분간 getOne 및 getAll을 호출 할 수 있습니다. getAll은 본질적으로 계열의 루프를 만들고 getOne을 호출 한 다음이를 해시에 매핑하고 다시 체인으로 보냅니다. 여기서 커피 스크립트에서 I 가진 것을 기본적 :

getOne = (key, callback) -> 
    try 
     # find object referenced by key 
     object = "blah blah" 
     callback(null, object) 
    catch(error) 
     callback(error, null) 

getAll = (keys, callback) -> 
    results = {} 
    try 
     count = keys.length 
     for i, key of keys 
      count-- 
      getOne key, (err, result) -> 
       if(err) 
        # do something 
       else 
        results[key] = result 
       if count is 0 
        callback "", results 
    catch 
     callback error, results 

위의 코드는 기본적으로 키 루프 방식 A가 비동기 처리 예상되는 예상 데이터와 반드시 라인업없는 해시를 출력한다. 그러나 루프를 차단하지 않고 병렬 처리를 유지하는 대신 모든 것을 직렬로 처리하는 솔루션을 생각해 낼 수 없습니다.

무엇이 누락 되었습니까?

답변

3

작성한 코드와 관련하여 본질적으로 비동기적인 것은 없습니다. getOne의 콜백이 실행 시간이 오래 걸리는 것에 대해 걱정한다면 몇 가지 옵션이 있습니다.

에 대한 귀하의 각 반복의 실행을 연기합니다.

두 번째 옵션은 getAll 함수를 for 대신에 재귀 함수로 다시 작성하고 process.nextTick에 재귀 하위 코드를 래핑하는 작업입니다.

이 문서에서는이 수행하는 process.nextTick를 사용하는 방법을 이해하는 데 상당히 유용합니다 다음 async 라이브러리를 사용하여 Understanding process.nextTick()

2

를,이만큼 간단합니다

getAll = (keys, callback) -> 
    funcs = {} 
    keys.forEach (key) => funcs[key] = (_callback) => 
    getOne key, _callback 
    async.parallel funcs, callback