7 votes

La promesse est en suspens

J'ai une classe dans mon application nodejs avec le code suivant :

var mongoose    = require('mongoose');
var Roles       = mongoose.model('roles');
var Promise     = require("bluebird");

module.exports = Role;

var err = null;
var id;

function Role(name, companyId) {
    this.err = err;
    this.name = name;
    this.companyId = companyId;
    this.id = getId(name, companyId);
}

var getId = function (name, companyId) {
     return new Promise(function(resolve, reject) {
        Roles.findOne({companyId:companyId, name:name}, function(err,result) {
              resolve(result._id);
        });
     });
};

Lorsque j'appelle la classe, l'identifiant est en attente :

var currentRole = new Role(myRole, comId);
console.log(currentRole);

Comment puis-je obtenir les valeurs de la classe lorsqu'elles sont résolues ?

4voto

Matt Harrison Points 10047

currentRole.id est une promesse, vous pouvez donc appeler then() pour attendre que le problème soit résolu :

var currentRole = new Role(myRole, comId);
currentRole.id.then(function (result) {

    // do something with result
});

Il s'agit d'une API étrange, car on s'attend à ce que l'objet soit "prêt à l'emploi" lorsque le constructeur revient. Il serait préférable d'avoir getId est une fonction de retour de promesse sur le prototype de Role donc vous faites plutôt quelque chose comme :

var currentRole = new Role(myRole, comId);
currentRole.getId().then(function (result) {

    // do something with result
});

Vous devriez également envisager de traiter cette erreur pour rejeter la promesse :

var getId = function (name, companyId) {
     return new Promise(function(resolve, reject) {
        Roles.findOne({companyId:companyId, name:name}, function(err,result) {

              if (err) {
                  return reject(err);
              }
              resolve(result._id);
        });
     });
};

et ajoutez un gestionnaire de rejet à votre appel à getId :

var currentRole = new Role(myRole, comId);
currentRole.getId().then(function (result) {

    // do something with result
}, function (err) {

    // do something with err
});

ou de manière équivalente :

var currentRole = new Role(myRole, comId);
currentRole.getId().then(function (result) {

    // do something with result
}).catch(function (err) {

    // do something with err
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X