2017-09-12 2 views
3

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.

+1

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

+0

arrTables.length? ist das nicht anzunehmen response.length? Da hast du den Callback angerufen? – jhek

+0

@skirtle Die Tabellenklasse kehrt bei der Beendigung ihrer Datenbankabfragen von einer Callback-Funktion zurück. – erv

Antwort

3

Das Problem mit der Array-Variable. Die GetTable-Methode gibt nichts zurück, und die Ausgabe dieser Methode wird in der Antwortvariablen nicht in der Variablen arrTables gespeichert. versuchen response Variable statt an den Steuerfluss Promises Anpassung arrTables

getTables().then(function(response) { 
    var arrTables = response //Added 
    console.log("getTables() resolved"); 
    console.log(arrTables.length); 
    console.log(arrTables[1].ID); 
    }, function(error) { 
     console.error("getTables() finished with an error"); 
}); 
+0

Dies ist, was ich in meinem Kommentar @erv – jhek

+0

Oder nur "getTables(). Dann (Funktion (arrTables) {...' –

+0

dies ergibt die folgende Ausgabe der Konsole: getTables() aufgelöst (node: 5580) UnhandledPromiseRejectionWarning: Unbehandelte Versprechen Ablehnung (Ablehnung ID: 1): Typeerror: arrTables [1] .ID ist keine Funktion Klassentabelle ID Methode ist: ID() { console.log ("Innere Tabellenklasse ID this.ID Funktion:" + this.ID); Rückgabe this.ID; } Ich weiß nicht, wie Block-Code-Format in Kommentaren zu tun. Kann jemand es bearbeiten? – erv

3

verwenden können, um einige gewöhnungs zu nehmen. Sie sind nah dran! Aber ...

var arrTables = getTables().then(function(response) { console.log("getTables() resolved"); console.log(arrTables.length); ... ist eine Variablendeklaration.

Dies ist analog zum Schreiben var a = a. Sie können in der Deklaration von arrTables nicht auf arrTables zugreifen, da dies noch nicht deklariert wurde!

Die anonyme Funktion, die Sie vorbei an .then() ist (wo Sie den Zugriff auf Eigenschaften des die versuchen fälschlicherweise zu der Zeit, undefined Variable arrTables) die gleiche Funktion, die Sie als resolve(mLobby.tables) in Ihrem Versprechen nennen.

Das Versprechen Sie von getTablesVersprechen Rückkehr mLobby.tables() auf Ihre anonyme Funktion als response passieren.

Ich empfehle einige Übung mit Versprechungen, bevor Sie versuchen, sie in eine größere Anwendung zu arbeiten.

Die ausgezeichnete nodeschool.io Werkstatt promise-it-wont-hurt war sehr hilfreich für mich.

0

können Sie folgenden Code versuchen.

app.get("/getTables", async function (req, res) { 
    var arrTables = await getTables() 
    console.log(arrTables.length); 
    console.log(arrTables[1].ID()); 
}); 

async function getTables() { 
    return new Promise(function(resolve, reject) { 
     try { 
      while (mLobby.tlbCount() < LOBBY_SIZE) { 
       var objTable = new Table(); 
       mLobby.addTable(objTable); 
      } 
      resolve(mLobby.tables); 

     } catch (err) { 
      console.error("getTables() finished with an error"); 
      reject(err) 
     } 
    }); 
} 

hoffe, es wird für Sie arbeiten.

+0

diesen Fehler: app.get ("/ getTables", Asynchron-Funktion (req, res) { ^^^^^ Syntaxerror: fehlt) nach Argumentliste – erv

Verwandte Themen