2016-04-24 17 views
6

Ho una classe nella mia applicazione nodejs con il seguente codice:Promessa è in attesa di

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

Quando io chiamo la classe, l'id è in attesa:

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

Come posso ottenere il valori della classe quando vengono risolti?

+0

Si dovrebbe rifiutare quando c'è un errore. – Bergi

+0

Dai un'occhiata a [È una cattiva pratica che una funzione di costruzione restituisca una Promessa?] (Http://stackoverflow.com/q/24398699/1048572) - probabilmente non vuoi fare 'currentRole.id.then (...) ' – Bergi

risposta

3

currentRole.id è una promessa così si può chiamare then() su di esso per aspettare che si risolva:

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

    // do something with result 
}); 

Questo si sente come una strana API però, ci si aspetta il vostro oggetto di essere "pronto per l'uso" quando il suo costruttore ritorna. Potrebbe essere meglio avere getId essere una promessa funzione che restituisce sul prototipo di Role in modo da invece fare qualcosa di simile:

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

    // do something with result 
}); 

Si dovrebbe anche prendere in considerazione la gestione che l'errore di respingere la promessa:

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

e aggiungere un gestore di rifiuto al tuo invito getId:

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

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

    // do something with err 
}); 

o equivalentemente:

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

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

    // do something with err 
}); 
+0

Grazie Matt! Ho usato il tuo ultimo suggerimento e il codice funziona ora e sembra molto più pulito. –