2014-12-09 4 views
-1

나는이 게시물을 살펴 보았다 : setTimeout in Node.js loop은 내 문제를 해결할 수 있기를 희망하고있다. 그러나 나는 스스로 해결할 수없는 새로운 문제에 직면하고 있습니다.nodejs의 setTimeout - for 루프

저는 지난 몇 시간 동안이 문제를 해결하려고 노력했지만 운이 없었습니다. 여기에 내가 무엇을 가지고 :

타임 아웃 기능을 호출 할 필요가 기능 :

function searchLDAP(i, app, userUID){ 
    app.process_args(userUID[i]); 
} 

이 제대로 작동하지 않는 코드의 일부입니다. 이 코드는 첫 번째 반복 (userUID[0])에서 작동하지만 재귀를 시도하면 iundefined이됩니다.

function doSetTimeout(i, count, app, userUID) { 
    if(i == count - 1){ callback(); }  
    searchLDAP(i, app, userUID); 

    ++i; 
    setTimeout(doSetTimeout, 2000); 
} 

나는

async.series([ 
    function(callback) { 
     app.readLines(input, callback); // userUID is and array that 
             // is returned from this function 
    }, 
    function() { 
     var count = userUID.length; 
     var i = 0; 
     doSetTimeout(i, count, app, userUID); 
    } 
    ], function(err) { 
     console.log('all functions complete'); 
}); 

setTimeout으로 사전에

-Patrick

답변

1

을 주셔서 감사합니다, 함수가 호출해야 당신은 단지 명령하지만, 통과하지 못한 노드의 비동기 모듈을 사용하고 있습니다 함수가 사용해야하는 인수 세트. 이 같은도보다 효율적으로 사용하는 비동기을 (극적으로 복잡성과 코드의 라인을 줄일) 수의 답변을 raina77ow에 대한 대안으로

function doSetTimeout(i, count, app, userUID) { 
    if (i == count - 1) { 
     return; // you should stop the recursion 
    } 

    searchLDAP(i, app, userUID); 

    setTimeout(function() { 
     doSetTimeout(i + 1, count, app, userUID); 
    }, 2000); 
} 
+0

이렇게하면 어레이의 마지막 요소에 대한 정보 만 반환합니다. 예를 들어, 전달해야하는'userUID'가 5 개인 경우'searchLDAP() '를 5 번 호출하지만'userUID [0]'이 아닌'userUID [4]'만 사용하고 userUID [1]'... etc ... –

+0

앱이 정보를 정확히 '반환'합니까? 'setTimeout'으로 문제를 해결하는 것에 대한 질문이 아니 었습니까? – raina77ow

+0

권자, 대답을 잘못 읽었습니다. 그것은 효과가 있었다. 도와 줘서 고마워. 'doSetTimeout'을 호출하기 전에'function() {...}'을 넣는 것을 잊었습니다. –

0

: 그리고 여기에이 문제를 해결하기 위해 하나의 가능한 접근 방식

app.readLines(input, function(err, users) { 
    async.each(users, function(user, next) { 
     app.process_args(user); 
     next(); 
    }, function(err) { 
     console.log('all functions complete'); 
    }); 
}); 

이렇게하면 각 사용자 (게시자의 userUID 배열)를 반복하고이 값을 함수에 전달합니다. 나는 너 자신의 가치를 추적하는 것을 망칠 필요가 없다. 이것은 속도 제한이 없으며 process_args 메소드가 동시 호출을 처리 할 수없는 경우에만 필요한 setTimeout을 가지고 있지 않습니다. 어떤 이유로 당신이 정말 통화 사이의 2 초 지연을해야하는 경우를

app.readLines(input, function(err, users) { 
    async.eachSeries(users, function(user, next) { 
     app.process_args(user); 
     next(); 
    }, function(err) { 
     console.log('all functions complete'); 
    }); 
}); 

을 그리고 : 당신은 대신 eachSeries을 사용할 수 있습니다, 단 하나의 app.process_args 한 번에 호출되는이 있는지 확인해야하는 경우 다음을 수행 할 수 있습니다.

app.readLines(input, function(err, users) { 
    async.eachSeries(users, function(user, next) { 
     setTimeout(function() { 
      app.process_args(user); 
      next(); 
     }, 2000); 
    }, function(err) { 
     console.log('all functions complete'); 
    }); 
}); 
+0

고맙습니다. 나는이 방법을 시도 할 것이다. –