Javascript Rekursives Versprechen

8

Ich versuche eine rekursive Funktion mit Promises zu erstellen, aber ich kann es nicht richtig scheinen. Ich habe Arbeitscode, ohne Versprechungen zu verwenden, aber es verwendet Zähler und globale Variablen usw. und fühlt sich nicht ganz richtig an, also versuche ich ein Neuschreiben und auch ein Modul für die Wiederverwendung zu erstellen.

Im Wesentlichen soll die Funktion einen Benutzer aus Active Directory holen und dann rekursiv direkte Berichte und deren direkte Berichte usw. finden.

Ich habe mit vielen Versionen der Funktion gespielt, das ist die aktuelle:

%Vor%

Die Funktion getAccessTokenPromise führt eine Anforderung für ein Zugriffstoken aus und gibt eine Zusage dafür zurück. Die Funktion makeRequest erstellt erneut eine HTTPS-Anforderung für den Benutzer und ihre Berichte und gibt ein JSON-Objekt mit den Ergebnissen als Versprechen zurück.

Irgendwelche Gedanken sehr erhalten. Danke vielmals. D.

    
Darren 07.09.2016, 05:52
quelle

1 Antwort

6

Damit Rekursion mit Versprechen funktioniert, möchten Sie im Allgemeinen alle rekursiven Versprechen an ihre Anrufer ketten. Um dies zu tun, MÜSSEN Sie alle Versprechen Ihrer .then() Handler zurückgeben, damit sie an die Originale angekettet werden. Dies führt auch dazu, dass Sie Ihr vielversprechendes Anti-Pattern des Umschließens eines vorhandenen Versprechens mit einem manuell erstellten Versprechen nicht mehr verwenden Das ist voller Probleme. Hier ist eine Möglichkeit, das zu tun:

%Vor%

Änderungen vorgenommen:

  1. Fügen Sie return vor getAccessTokenPromise () hinzu, damit wir das ursprüngliche Versprechen zurückgeben. Dadurch können wir auch die new Promise() und die gesamte manuelle Zurückweisung und Auflösung, die an dem Anti-Pattern beteiligt war, eliminieren.

  2. Fügen Sie return vor dem rekursiven loadReports() hinzu. Dies muss geschehen, damit .map() dieses Versprechen sammeln kann, bevor es an Promise.all() übergeben wurde.

  3. Fügen Sie return vor Promise.all() hinzu, so dass es an die ursprüngliche Versprechenskette angekettet ist.

Sie müssen sicherstellen, dass Sie in den Datenbankdaten niemals irgendeine Art von Zirkularität erhalten (ein Fehler in der DB, der eine kreisförmige Liste von Berichten erstellt). Ein Bericht an B, B an C, C an A, denn wenn Sie diesen Code hätten, würde dieser Code für immer andauern und nie enden (wahrscheinlich würde er irgendwann eine Systemressource erschöpfen).

Wenn dies mein Code wäre, könnte ich einen Satz aller in der Datenbank besuchten Personen erstellen und weigern, loadReports() für jede Person anzurufen, die wir schon einmal besucht haben. Dies würde es sicher vor Zirkularität machen. Wahrscheinlich würdest du auch log() wollen, wenn du diese Bedingung gesehen hättest, weil es wahrscheinlich ein Datenbankfehler / Korruption wäre.

    
jfriend00 07.09.2016, 06:04
quelle