У меня есть рекурсивная функция в 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 будет неопределенным, но это часть первоначальной реализации, которая работала с меньшим тестом.
Мне просто нужно иметь возможность регистрировать значение в конце.
Большое вам спасибо за помощь! Это очень высоко ценится!
Какая часть этого асинхронна? Кажется, это полностью синхронно. – McMath
Ваш обратный вызов не является рекурсивным. Это просто анонимная функция, вызываемая с каждой рекурсивной итерацией 'recursiveCall'. Ваши рекурсивные призывы, похоже, находятся в положении хвоста. Я не знаю, поддерживает ли node.js или базовый хромовый движок TCO. Может быть, это переполнение стека? – ftor