Asynchrone Initialisierung von express.js (oder ähnlichen) Apps

8

Betrachten Sie ein Beispiel: Ich habe die folgende express.js App (siehe Code-Snippet unten). Ich möchte eine persistente Verbindung zur Datenbank und eine persistente Verbindung zu meinem eigenen Dienst (der einen asynchronen Aufruf zum Starten benötigt) während der gesamten Lebensdauer der App haben. Und es gibt ein paar Einstiegspunkte, d. H. Man kann nicht nur über das HTTP-Protokoll auf meine App zugreifen. Natürlich möchte ich Service-Initialisierungscode-Duplizierung vermeiden, und es könnte mehrere solche async-initialisierende Dienste geben.

%Vor%

Im obigen Code-Snippet gibt es zu dem Zeitpunkt, an dem der http-Server (oder Telnet-Server oder irgendein anderer Server) gestartet wird, keine Garantie, dass myService bereits initialisiert wurde.

Also muss ich meinen App-Erstellungscode irgendwie reorganisieren. Fürs Erste bleibe ich bei der nächsten Lösung:

%Vor%

Also, meine Frage ist: Was ist die übliche Art, Dienste zu initialisieren, die asynchronen Aufruf benötigt, um zu starten?

    
Ivan Velichko 07.01.2016, 16:34
quelle

1 Antwort

0

Ich habe hier ein Stichwort mit einem Beispiel des Codes erstellt, den ich normalerweise für diese Aufgabe verwende. (Es verwendet die Q-Versprechen-Bibliothek, könnte aber leicht modifiziert werden, um jede andere Versprechens-Lib zu verwenden).

Die Grundidee besteht darin, das App-Backbone als eine Folge von asynchronen Initialisierungsschritten zu beschreiben. Jeder Schritt ruft eine oder mehrere asynchrone Funktionen auf und bindet das Ergebnis an einen Namen. Der Startprozess schreitet nur dann zum nächsten Initialisierungsschritt fort, wenn alle Werte für den aktuellen Schritt aufgelöst sind, und nachfolgende Schritte können dann auf alle Werte zugreifen, die durch vorherige Schritte aufgelöst wurden. Dies ermöglicht eine einfache Beschreibung der Abhängigkeitsreihenfolge von Diensten und Komponenten innerhalb der App.

Beispielsweise kann ein Backbone wie folgt definiert werden:

%Vor%

(Beachten Sie, dass in jeder Schrittdefinition nur Verweise auf jede Funktion angegeben sind; die Funktion start() - im Geiste angezeigt - ruft jede Funktion in der richtigen Reihenfolge auf).

Jeder der startXxx Variablen ist eine Funktion, die ein einzelnes Argument akzeptiert und eine verzögerte Zusage zurückgibt, z. B .:

%Vor%

Das app -Argument der Funktion stellt den konfigurierten App-Backbone dar, und die Ergebnisse vorheriger Initialisierungsschritte sind als benannte Eigenschaften verfügbar.

Ich habe dieses Muster in ziemlich komplizierten Systemen verwendet und finde es eine einfache, flexible und effektive Möglichkeit, die Struktur eines Systems auf hoher Ebene zu definieren.

    
Julian Goacher 12.06.2017 17:58
quelle