承诺正在等待
我在我的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,但是你期望你的对象在构造函数返回的时候“准备好使用”。 可能有更好的getId
是Role
的原型上的承诺返回函数,所以你可以这样做:
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 });