【问题标题】:NodeJS Q Promise erroring "has no method 'then'"NodeJS Q Promise 错误“没有方法 'then'”
【发布时间】:2014-11-15 19:48:58
【问题描述】:

我正在努力实现一个承诺(第一次将它们与节点一起使用)但我不断收到错误:

TypeError: Object function (){
    Users.findById(req.body.receiver).exec(function (err, user){
    if(err) return handleError(err);
    if(user.local.email ){
      return email = user.local.email
    }
    if(user.facebook.email){
      return email = user.facebook.email
    }
  })
  } has no method 'then'

从错误来看,我不得不猜测return function() 有什么问题?

这是我的功能:

exports.sendEmail = function(req,res){
  function findEmail(){
    return function(){
      Users.findById(req.body.receiver).exec(function (err, user){
        if(err) return handleError(err);
          if(user.local.email ){
          return email = user.local.email
        }
        if(user.facebook.email){
          return email = user.facebook.email
        }
      })
    }
  }

  findEmail().then(function(email){
    // do stuff
  })
}

【问题讨论】:

  • findEmail()().then(

标签: node.js q


【解决方案1】:
function findEmail(){
  return function(){
    return Q();
  };
}
findEmail(); // returns a function

在您的示例中,findEmail 返回一个函数,如果调用该函数,则返回一个承诺。但是,您尝试使用返回的函数,就好像它是一个承诺,但它不是一个函数。

两种修复方法:

findEmail()(); // returns the promise

或者重构函数:

function findEmail() {
  return Q();
}
findEmail(); // returns the promise

注意到缺少的return function()

【讨论】:

  • 当我像pastie.org/9721679 这样编写代码时,它会返回整个 JSON 对象,而不仅仅是我想要获取的电子邮件对象。您对如何获取电子邮件有任何建议吗?感谢您迄今为止的帮助。我现在确实看到让我的主函数返回另一个函数是如何导致问题的。
  • exec 是否同步执行?如果不是,那么 Q 承诺不会像您认为的那样解决。您可能想要 Q.defer() 或类似的东西。尝试在另一个问题中询问该馅饼。
【解决方案2】:

嵌套过多?你真的需要那个额外的函数包装器吗?

exports.sendEmail = function(req,res){
  function findEmail(){
    Users.findById(req.body.receiver).exec(function (err, user){
      if(err) return handleError(err);
        if(user.local.email ){
        return email = user.local.email
      }
      if(user.facebook.email){
        return email = user.facebook.email
      }
    })
  }

  findEmail().then(function(email){
    // do stuff
  })
}

编辑:我还会在这里进行一些认真的重构,承诺一些东西(混合回调和承诺在视觉上并不是很好,承诺的代码看起来好多了),如果命名函数只在内部使用一次,则避免使用,等等。 .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-18
    • 2017-01-09
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2016-06-08
    • 1970-01-01
    相关资源
    最近更新 更多