2017-09-12 1 views
3

Je ne peux pas comprendre comment les promesses fonctionnent. Donc je me suis dit que je sauterais juste dedans et essayerais d'en créer un pour voir si ça aide. Mais les rendements suivants d'une valeur non définie (de arrTables):Je ne peux pas obtenir une promesse ES6 pour travailler

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() fait référence à une classe personnalisée qui fait un appel de base de données async. J'essaye d'utiliser des promesses pour m'assurer que l'appel résout avant que je continue dans le code. Quelqu'un peut-il signaler où je me suis trompé?

est ici la sortie de la console:

getTables() resolved 
undefined 
(node:6580) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 
1): TypeError: Cannot read property 'ID' of undefined 

Edit pour ajouter: mLobby.tblCount commence comme 0, il fait entrer dans la boucle while.

+1

Vous devez attendre la fin de l'appel de la base de données avant de résoudre le problème. Comment exactement vous faites cela dépend du mécanisme que Table fournit pour savoir quand c'est fait. – skirtle

+0

arrTables.length? n'est-ce pas supposé être response.length? puisque c'est ce que vous avez appelé pour le rappel? – jhek

+0

@skirtle La classe table renvoie depuis l'intérieur d'une fonction de rappel à la fin de ses requêtes de base de données. – erv

Répondre

3

Le problème avec la variable de tableau. la méthode GetTable ne renvoie rien et la sortie de cette méthode est stockée dans la variable de réponse non dans la variable arrTables. essayez d'utiliser response variable au lieu de 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

c'est ce que je fais remarquer dans mon commentaire @erv – jhek

+0

Ou juste 'getTables(). Then (function (arrTables) {...' –

+0

Cela donne à la sortie de la console suivante: getTables() résolu (node: 5580) UnhandledPromiseRejectionWarning: Unhandled rejet d'engagement (id de rejet: 1): Erreur de type: arrTables [1] .ID est pas une fonction La méthode d'ID de classe de classe est: ID() { console.log ("fonction d'ID de classe de table interne this.ID:" + this.ID); renvoyer this.ID; } Je ne sais pas comment faire du format de code en bloc dans les commentaires. Quelqu'un peut-il l'éditer? – erv

3

Adaptation au flux de contrôle des promesses peut prendre un certain temps pour s'y habituer. Vous êtes proche! Mais ...

var arrTables = getTables().then(function(response) { console.log("getTables() resolved"); console.log(arrTables.length); ... est une déclaration variable.

Ceci est analogue à l'écriture var a = a. Vous ne pouvez pas accéder à arrTables dans la déclaration de arrTables car il n'a pas encore été déclaré!

La fonction anonyme que vous passez à .then() (où vous essayez tort d'accéder aux propriétés de la, à l'époque, undefined arrTables variable) est la même fonction que vous appelez comme resolve(mLobby.tables) au sein de votre promesse.

La promesse que vous revenez de getTablespromesses passer mLobby.tables() à votre fonction anonyme comme response.

Je recommande de faire un peu de pratique avec des promesses avant d'essayer de les travailler dans une application plus grande.

L'excellent nodeschool.io workshopper promise-it-wont-hurt m'a été très utile.

0

vous pouvez essayer le code suivant.

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) 
     } 
    }); 
} 

espérons que cela fonctionnera pour vous.

+0

Lancers cette erreur: app.get ("/ getTables", la fonction async (req, res) { ^^^^^ SyntaxError:) manquant après la liste des arguments – erv