承诺正在等待

我在我的nodejs应用程序中有一个类,下面的代码:

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

当我打电话给这个class时,这个ID是挂起的:

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

如何解决课堂上的价值观?

currentRole.id是一个承诺,所以你可以调用then()来等待它的解决:

 var currentRole = new Role(myRole, comId); currentRole.id.then(function (result) { // do something with result }); 

这感觉就像一个奇怪的API,但是你期望你的对象在构造函数返回的时候“准备好使用”。 可能有更好的getIdRole的原型上的承诺返回函数,所以你可以这样做:

 var currentRole = new Role(myRole, comId); currentRole.getId().then(function (result) { // do something with result }); 

您还应该考虑处理该错误以拒绝承诺:

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

并添加拒绝处理程序到您的调用getId

 var currentRole = new Role(myRole, comId); currentRole.getId().then(function (result) { // do something with result }, function (err) { // do something with err }); 

或等同地:

 var currentRole = new Role(myRole, comId); currentRole.getId().then(function (result) { // do something with result }).catch(function (err) { // do something with err });