Tengo una función de javascript que recorre un árbol recursivamente. Tiene dos variables de "bandera" que se configuran como falsas o verdaderas por encima del alcance de la función en sí, de modo que si una bandera se configura como verdadera una vez mientras se está recursivamente la función "walkTree", será verdadera para cada recursión . Por otro lado, el bucle for podría existir la función con un retorno también si algo es para. El problema que tengo es que cuando hay demasiadas recurrencias obtengo un error.cómo hacer que esta función recursiva sincrónica sea asíncrona
Me gustaría evitar este problema al hacer que esta función recursiva sea asincrónica. He intentado poner la llamada sub walkTree() dentro del ciclo for en un setTimeout, pero el problema que tengo ahora es que el resto del la función se ejecutará (y puede devolver el valor incorrecto) antes de que el resto de las cosas asincrónicas se realice. Entonces, ¿cómo puedo hacer esto asíncrono mientras sigo asegurándome de que se devolverá el valor correcto (y no la llamada a la función superior en la recursión)?
Como puede ver, el final de la función utiliza esa "variable" flagB compartida por todas las llamadas, por lo que debemos asegurarnos de que todas las llamadas recursivas se hayan completado (y devuelto algo) antes de que el superior para estos condicionales. ¡Gracias!
var flagA = false;
var flagB = false;
var walkTree = function (n) {
var sub;
for (var i = 0; i < n.children.length; i++) {
sub = walkTree(n.children[i]);
if (sub === 'something-special') {
return sub;
}
}
var test = doSomethingWith(n);
if (test === "something") {
flagA = true;
}
if (test === "something-else") {
flagB = true;
}
if (flagB === true) {
return true;
}
if (test === "something-special") {
return test;
} else {
return false;
}
}
funciones asíncronas no será capaz de devolver un valor útil, tendrá que proporcionar una función de devolución de llamada como parámetro. – zzzzBov
¿Por qué no está comprobando si el elemento (argumento) tiene hijos antes de recorrerlos? – Headshota
Yeh en mi función real que estoy haciendo si (n.children! = Undefined && n.children.length> 0) –