Betrachten Sie ein Beispiel: Ich habe die folgende App (siehe Code-Schnipsel 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 die Dienst-Initialisierungscode-Duplizierung vermeiden, und es könnte mehrere solcher async-initialisierenden Dienste geben.Asynchrone Initialisierung von express.js (oder ähnlichen) Anwendungen
/* app.js */
var app = require('express')();
// set views, use routes, etc.
var db = require('monk/mongoose/etc')(...); // happily, usually it's a sync operation
var myService = require('./myService'); // however, it's possible to have several such services
myService.init(function(err, result) {
// only here an initialization process is finished!
});
module.exports.app = app;
/* http_server.js (www entry point) */
var app = require('app');
// create an HTTP server with this app and start listening
/* telnet_server.js (other entry point) */
var app = require('app');
// create a Telnet server with this app and start listening
Im Codeausschnitt oben, durch die Zeit, http (oder Telnet oder andere) Server gestartet wird, gibt es keine Garantie, dass myService
bereits initialisiert wurde.
Also muss ich irgendwie meinen App-Erstellungscode reorganisieren. Vorerst bleibe ich mit der nächsten Lösung:
/* app.js */
var app = require('express')();
module.exports.app = app;
module.exports.init = function(callback) {
var myService = require('./myService');
myService.init(callback);
}
/* entry_point.js */
var app = require('app');
app.init(function(err) {
if (!err) {
// create an HTTP/Telnet/etc server and start listening
}
});
Also, meine Frage ist: Was ist der gemeinsame Weg ist, Dienste zu initialisieren asynchronem Aufruf für den Start erforderlich?
Es ist wirklich nicht anders als, wie Sie jede asynchrone Menge von Operationen serialisieren. Wenn Sie möchten, dass sie in einer bestimmten Reihenfolge ausgeführt werden, verketten Sie Versprechungen, oder Sie führen die zweite Operation im Abschlussrückruf der ersten asynchronen Operation aus. Wenn Sie N unabhängige asynchrone Operationen haben, die alle ausgeführt werden sollten, bevor Sie etwas anderes tun, dann verwenden Sie Versprechungen und 'Promise.all()'. Nicht anders beim Starten eines Servers als bei jeder anderen Koordination mehrerer asynchroner Operationen. – jfriend00