Mam funkcję javascript, która przechadza się po drzewie rekursywnie. Ma dwie zmienne "flag", które są ustawione na false lub true powyżej zakresu samej funkcji, a więc jeśli flaga jest ustawiona na wartość true jeden raz, podczas gdy funkcja "walkTree" jest powtarzana, będzie to prawdziwe dla każdej rekursji . Z drugiej strony, pętla for mogłaby istnieć z funkcją powrotu, jeśli coś jest przeznaczone. Problemem, który mam, jest to, że w przypadku zbyt wielu rekursji pojawia się błąd.jak zrobić tę synchroniczną funkcję rekurencyjną asynchroniczną
Chciałbym zapobiec temu problemowi, czyniąc tę funkcję rekursywną asynchroniczną, próbowałem umieścić wywołanie sub walkTree() wewnątrz pętli for w funkcji setTimeout, ale problem, który mam teraz, polega na tym, że reszta funkcja zostanie wykonana (i może zwrócić błędną wartość) zanim reszta asynchronicznych elementów zostanie wykonana. Jak mogę to zrobić asynchronicznie, jednocześnie upewniając się, że zwrócona zostanie prawidłowa wartość (a nie najwyższe wywołanie funkcji w rekursji)?
Jak widzisz, koniec funkcji wykorzystuje tę flagęB "zmienną" wspólną dla wszystkich wywołań, więc musimy upewnić się, że wszystkie rekursywne wywołania zostały zakończone (i zwrócone coś) zanim najwyższa kontrola dla tych warunkowych. Dzięki!
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;
}
}
funkcje asynchroniczne nie będą mogli powrócić użyteczną wartość, trzeba zapewnić funkcję zwrotną jako parametr. – zzzzBov
Dlaczego nie sprawdzasz, czy element (argument) ma dzieci przed przejściem przez nie? – Headshota
Yeh w mojej obecnej funkcji robię, jeśli (n.children! = Undefined && n.children.length> 0) –