为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 nodejs 中使用异步等待

如何在 nodejs 中使用异步等待

月关宝盒 2021-11-04 16:38:26
我做了一个像下面这样的api。我认为它毫无疑问地工作得很好。exports.query = async(req, res) => {   try{      const result = await user.findOne({})      res.send(result);   } catch(error) {      res.send(error)   }}但是当我像下面这样尝试时,我不确定它是否异步工作。exports.query = async(req, res) => {   try{      user.findOne({})         .then(async(result) =>{               order.findOne({id: result.id})         .catch(e => res.send(e)   } catch(error) {      res.send(error)   }}我必须像下面这样在 user.findOne({}) 前面附加“await”?exports.query = async(req, res) => {       try{          await user.findOne({})              .then(async(result) =>{还是没关系?也就是说,它的工作原理是一样的,即使我没有在 user.findOne 前面写 await 使用 'then'?非常感谢您的阅读。
查看完整描述

2 回答

?
米脂

TA贡献1836条经验 获得超3个赞

一般情况下,单块内,你应该要么使用await,或使用.then,但不能两者都-同样,使用Promise.prototype.catch是非常奇怪的结合try/catch,你已经可以await。


让你exports.query在第二个findOne完成后解决,await或者返回两个Promise ,并将内部findOne连接到外部 Promise 链。考虑这样的事情:


exports.query = async (req, res) => {

  try {

    const userResult = await user.findOne({});

    const orderResult = await userResult.findOne({ id: userResult.id });

    // do something with orderResult

  } catch (error) {

    res.send(error)

  }

}

如果您使用.then和catch不使用await,那么它看起来像:


exports.query = (req, res) => {

  return user.findOne({})

    .then((result) => {

      return order.findOne({

          id: result.id

        })

        .then((orderResult) => {

          // do something with orderResult

        })

        .catch(e => res.send(e))

    });

}

使用您问题中第二个片段中的代码,您的try/catch 块将永远不会做任何有用的事情,因为任何问题都会触发该.catch方法,并且因为 Promise 没有被await编辑。最好不要混合这两种风格 - 要么选择await和try/catch或.then和.catch,但不能同时使用,否则控制流可能变得难以理解。


查看完整回答
反对 回复 2021-11-04
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

首先, async-await 可以用在返回承诺的函数中。为什么我们必须使用await而不是then. await通过使执行感觉像同步来异步处理代码。


在您的第一个示例中,一切正常。但是在第二个中,您需要等待 findOne 查询。这里的 FineOne 将异步工作


exports.query = async(req, res) => {

   try{

      user.findOne({})

         .then(async(result) =>{

              let orderResult = await order.findOne({id: result.id})

         .catch(e => res.send(e)

   } catch(error) {

      res.send(error)

   }

}

可以再次简化为


exports.query = async(req, res) => {

   try{

      let result = await user.findOne({});

      let orderResult  = order.findOne({id: result.id});


   } catch(error) {

      res.send(error)

   }

}


查看完整回答
反对 回复 2021-11-04
  • 2 回答
  • 0 关注
  • 433 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信