【问题标题】:How to write a function that returns an error in javascript如何在javascript中编写一个返回错误的函数
【发布时间】:2015-01-24 09:32:39
【问题描述】:

在 mongoose.js 中,函数在每次查询后返回(错误、结果)。我想编写自己的功能。

我认为答案是使用承诺,所以我写了这个

  login: (user) ->
    q.Promise (resolve, reject, notify) ->
      console.log resolve
      if _.has(user, 'password')
        dashboard.users.find(user).exec().then (err, results) ->
          if err then reject("Error occurred with the database")
          if results then resolve(results) else reject("User not found")
      else
        reject("A password is required for login")

Auth.login(testuser).then (d) ->
    console.log d, "done"

但经过研究,我发现这是一个anti pattern,并且代码不起作用(承诺永远不会解决/拒绝)。所以现在我不知道该怎么办了。

【问题讨论】:

  • 你怎么知道承诺永远不会被解决/拒绝?我看不到您在任何地方都在使用实际的承诺。您的意思是从 login() 方法返回承诺吗?
  • 是的,我忘记添加代码了,我现在就添加
  • 就像我说的,你必须从login() 方法返回promise,这样login() 的调用者才能使用它。
  • 我的原始代码有这个,但它仍然是你所说的相同结果,我应该在最后返回 deferred.promise 对吗?

标签: javascript node.js coffeescript promise


【解决方案1】:

要从函数中返回错误作为 Promise,通常有两种方法可以产生被拒绝的 Promise:

  • 你的 Promise 库的reject function
  • then 回调中抛出异常或从中返回被拒绝的承诺将拒绝生成的承诺

这与为异步函数构建一个 Promise 具有相同的效果,该函数使用错误参数调用其节点样式回调。您的代码将被重写为

  login: (user) ->
    if _.has(user, 'password')
      q(dashboard.users.find(user).exec()).then (results) ->
        if results 
          results
        else
          throw new Error("User not found")
      , (err) ->
        throw new Error("Error occurred with the database")
    else
      q.reject("A password is required for login")

【讨论】:

    猜你喜欢
    • 2012-12-25
    • 2021-12-28
    • 2023-01-05
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2011-06-24
    • 2021-03-02
    相关资源
    最近更新 更多