2016-04-24 11 views
6

Ich habe eine Klasse in meiner NodeJS Anwendung mit dem folgenden Code:Versprechen aussteht

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

Wenn ich die Klasse nenne, die ID aussteht:

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

Wie kann ich das bekommen Werte aus der Klasse, wenn sie aufgelöst werden?

+0

Sie sollten "ablehnen", wenn es einen "Fehler" gibt. – Bergi

+0

Werfen Sie einen Blick auf [Ist es eine schlechte Übung, eine Konstruktorfunktion eine Promise zurückgeben zu lassen?] (Http://stackoverflow.com/q/24398699/1048572) - Sie wollen wahrscheinlich 'currentRole.id.then 'nicht machen (...) ' – Bergi

Antwort

3

currentRole.id ist ein Versprechen, so können Sie then() auf sie verlangen es gelöst werden, zu warten:

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

    // do something with result 
}); 

Dies obwohl wie eine seltsame API fühlt, können Sie Ihr Objekt erwarten zu sein „ready to use“, wenn Der Konstruktor kehrt zurück. Könnte besser sein, ein Versprechen zu haben getId sein Funktion auf dem Prototyp Role Rückkehr so ​​stattdessen tun Sie so etwas wie:

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

    // do something with result 
}); 

Sie auch, dass Fehler in Betracht ziehen sollten Umgang mit dem Versprechen abzulehnen:

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

und fügen Sie eine Ablehnung Handler auf Ihren Anruf zu getId:

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

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

    // do something with err 
}); 

oder äquivalent:

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

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

    // do something with err 
}); 
+0

Danke Matt! Ich habe Ihren letzten Vorschlag verwendet, und der Code funktioniert jetzt und sieht viel sauberer aus. –

Verwandte Themen