javascript - 异步函数总是返回 undefined

标签 javascript node.js asynchronous promise async-await

我使用的是 nodejs 8。我已经将 promise 结构代码替换为使用 async 和 await。

当我需要返回一个对象但 await sentence resolve undefined 时遇到问题。

这是我的 Controller 方法:

request.create = async (id, params) => {
    try {
        let request = await new Request(Object.assign(params, { property : id })).save()
        if ('_id' in request) {
            Property.findById(id).then( async (property) => {
                property.requests.push(request._id)
                await property.save()

                let response = {
                    status: 200,
                    message: lang.__('general.success.created','Request')
                }

                return Promise.resolve(response)
            })
        }
    }
    catch (err) {
        let response = {
            status: 400,
            message: lang.__('general.error.fatalError')
        }

        return Promise.reject(response)
    }               
}

在http请求函数中:

exports.create = async (req, res) => {
    try {
        let response = await Request.create(req.params.id, req.body)
        console.log(response)
        res.send(response)
    }

    catch (err) {
        res.status(err.status).send(err)
    }
}

我尝试用 thencatch 返回 Promise.resolve(response)Promise.reject(response) > 在中间件函数中发生相同。

怎么了?

非常感谢,干杯

最佳答案

您不一定需要在 async 函数中与 promise 进行交互。在 async 函数中,常规的 throw 语法与 return Promise.reject() 相同,因为 async函数 always 返回一个 Promise。我在您的代码中注意到的另一件事是您拒绝了 HTTP 处理程序中的 promise ,这肯定会在以后导致意外行为。您应该直接在处理程序中处理所有错误并相应地采取行动,而不是返回/抛出它们。

您的代码可以这样重写:

request.create = async (id, params) => {
  let request = await new Request(Object.assign(params, { property : id })).save()
  if ('_id' in request) {
    let property = await Property.findById(id)
    property.requests.push(request._id)
    await property.save()
  }
}

还有你的 http 处理程序:

exports.create = async (req, res) => {
  try {
    await Request.create(req.params.id, req.body)
    res.send({
      status: 200,
      message: lang.__('general.success.created','Request')
    })
  } catch (err) {
    switch (err.constructor) {
      case DatabaseConnectionError: // Not connected to database
        return res.sendStatus(500) // Internal server error
      case UnauthorizedError:
        return res.sendStatus(401) // Unauthorized
      case default:
        return res.status(400).send(err) // Generic error
    }
  }
}

错误类:

class DatabaseConnectionError extends Error {}
class UnauthorizedError extends Error {}

因为您在 http 处理程序方法中有 try/catch block ,所以 中任何 throwreject 的内容Request.create 方法将在那里被捕获。参见 https://repl.it/LtLo/3有关从 async 函数或 Promise 抛出的错误如何不需要在首次调用它们的地方直接捕获的更简洁的示例。

关于javascript - 异步函数总是返回 undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46509218/

相关文章:

javascript - codemirror - 空行号?

javascript - 如果 margin-left == 200px 则触发事件;

java - 在EJB中使用异步注释时出错

C# - 异步/等待打印顺序

javascript - 如何从 Javascript 字符串中删除前面的换行符

javascript - angularjs 自定义过滤器检查数据数组中的值

javascript - 合并 Mongoose 中的两个对象

javascript - 如何在 nodejs 中创建双工流?

node.js - sails js 框架中的 session 管理

c# - NetTcpBinding 和异步/等待 WCF 阻塞