2016-07-04 2 views
0

Node.js에는 재귀 호출의 리턴 값에 따라 여러 가지 지점에서 발생할 수있는 재귀 함수가 있습니다. 작은 테스트 케이스에서는 작동하지만, 일단 더 큰 데이터 세트를 얻으면 비동기 성은 그것을 망칩니다.Node.js 비동기식 재귀 콜백

내가 콜백을 사용하고 히트 반복의 양이 데이터 세트의 길이와 일치하는지 확인하려고했지만, 어떤 이유로 모두를 반복하기 전에 중지 (아마도 메모리 문제?)

는 여기

function recursiveCall(value, array, callback) { 
    callback(value) 
    if (/*base case*/) { 
     return value; 
    } 

    for (var i = 0; i < array.length; i++) { 

     if (/*conditional*/) { 
      var x = /* work + */ value 
      return recursiveCall(x, array, callback); 
     } 

     . 
     . 
     . 

     if (/*conditional*/) { 
      var x = /* work + */ value 
      return recursiveCall(x, array, callback); 
     } 
    } 
} 

var iters = 0; 
var finalValue = recursiveCall(initialValue, array, function(value) { 
    if (++iters >= array.length) 
     console.log(value); 
}); 

내가 finalValue와의 값이 정의되지 않은 것 이해하지만, 작은 테스트 케이스와 함께 일 원래 구현의 일부입니다 : 산발적 전화와 일반 코드의 흐름, 지금까지이 콜백합니다.

끝에 값을 기록 할 수 있어야합니다.

도움을 주셔서 대단히 감사합니다! 대단히 감사합니다!

+2

어떤 부분이 비동기입니까? 전적으로 동기식 인 것 같습니다. – McMath

+0

콜백이 재귀 적이 아닙니다. 'recursiveCall'의 재귀 적 반복마다 호출되는 익명의 함수입니다. 귀하의 재귀 호출은 꼬리 위치에있는 것 같습니다. node.js 또는 기본 크롬 엔진이 이미 TCO를 지원하는지 여부는 알 수 없습니다. 어쩌면 스택 오버플로입니까? – ftor

답변

0

이것은 비동기식 흐름이 아닙니다. recursiveCall 함수 내에서 for 루프를 사용하고 있습니다. 루프를 비동기로 만드는 for 루프는 forloop npm 모듈 https://www.npmjs.com/package/forloop입니다.

또는 당신은

setInterval(recursiveCall(x, array, callback));

대신 루프없이

return recursiveCall(x, array, callback); 로 사용할 수 있습니다.