Ich kann nicht verstehen, wie Versprechen funktionieren. Also dachte ich, ich würde einfach reinspringen und versuchen, eine zu erstellen, um zu sehen, ob das hilft. Aber gibt folgende Formel einen nicht definierter Wert (arrTables):Ich kann nicht ein ES6 Versprechen zu arbeiten
app.get("/getTables", function (req, res) {
var arrTables = getTables().then(function(response) {
console.log("getTables() resolved");
console.log(arrTables.length);
console.log(arrTables[1].ID());
}, function(error) {
console.error("getTables() finished with an error");
});
});
function getTables() {
return new Promise(function(resolve, reject) {
while (mLobby.tlbCount() < LOBBY_SIZE) {
var objTable = new Table();
mLobby.addTable(objTable);
}
resolve(mLobby.tables);
});
}
new Table()
verweist auf eine benutzerdefinierte Klasse, die einen asynchronen Datenbankaufruf macht. Ich versuche, Versprechungen zu verwenden, um sicherzustellen, dass der Anruf aufgelöst wird, bevor ich mit dem Code fortfahre. Kann jemand darauf hinweisen, wo ich falsch gelaufen bin?
Hier ist die Ausgabe der Konsole:
getTables() resolved
undefined
(node:6580) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id:
1): TypeError: Cannot read property 'ID' of undefined
bearbeiten hinzuzufügen: mLobby.tblCount beginnt als 0, so tut es die while-Schleife ein.
Sie müssen für die Datenbank-Aufruf warten abgeschlossen ist, bevor Sie lösen. Wie genau Sie das tun, hängt davon ab, welcher Mechanismus "Tabelle" für das Wissen bereitstellt, wann es fertig ist. – skirtle
arrTables.length? ist das nicht anzunehmen response.length? Da hast du den Callback angerufen? – jhek
@skirtle Die Tabellenklasse kehrt bei der Beendigung ihrer Datenbankabfragen von einer Callback-Funktion zurück. – erv