【问题标题】:Promise is pending承诺待定
【发布时间】:2016-04-24 18:59:17
【问题描述】:

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

当我调用类时,id 处于待处理状态:

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

当它们被解析时,我如何从类中获取值?

【问题讨论】:

标签: node.js promise bluebird


【解决方案1】:

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

【讨论】:

  • 谢谢马特!我使用了您的最后一个建议,代码现在可以运行并且看起来更干净。
猜你喜欢
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 2022-01-22
  • 2019-04-29
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多