2016-07-04 6 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. Альтернативный цикл для петли для асинхронного цикла - forloop a npm module https://www.npmjs.com/package/forloop.

Или вы можете использовать

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

вместо

return recursiveCall(x, array, callback); без цикл.

Смежные вопросы