Ho una funzione javascript che percorre un albero in modo ricorsivo. Ha due variabili "flag" che sono impostate su false o true al di sopra dell'ambito della funzione stessa, e quindi se un flag è impostato su true una volta mentre la funzione "walkTree" viene ripetuta, sarà vera per ogni ricorsione . D'altra parte, il ciclo for potrebbe esistere la funzione con un ritorno anche se qualcosa è per. Il problema che ho è quando ci sono troppe ricorsioni ottengo un errore.come rendere questa funzione ricorsiva sincrona asincrona
Vorrei evitare questo problema rendendo questa funzione ricorsiva asincrona, Ho provato a mettere il sub walkTree() chiamata all'interno del ciclo for in un setTimeout, ma il problema che ho ora è che il resto della la funzione verrà eseguita (e potrebbe restituire il valore errato) prima che venga eseguito il resto delle cose asincrone. Quindi, come posso renderlo asincrono pur continuando a verificare che venga restituito il valore corretto (e non la chiamata alla funzione principale nella ricorsione)?
Come si può vedere la fine della funzione si avvale di che flagB "variabile" condiviso da tutte le chiamate, e quindi abbiamo bisogno di assicurarsi che tutte le chiamate ricorsive sono stati completati (e restituito qualcosa) prima di quella superiore controlli per questi condizionali. Grazie!
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;
}
}
funzioni asincrone non sarà in grado di restituire un valore utile, è necessario fornire una funzione di callback come parametro. – zzzzBov
Perché non stai controllando se l'elemento (argomento) ha figli prima di eseguirne il ciclo? – Headshota
Sì, nella mia funzione effettiva sto facendo se (n.children! = Undefined && n.children.length> 0) –