最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

如何在nodejs中使用异步等待

运维笔记admin7浏览0评论

如何在nodejs中使用异步等待

如何在nodejs中使用异步等待

我制作了如下所示的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) =>{

还是没关系?也就是说,即使我不使用'then'在前面将await写到user.findOne上,它的工作方式也一样非常规。

非常感谢您阅读。

回答如下:

通常,在一个块中,您应该任一使用await使用.then,但不能两者都使用-类似地,组合使用Promise.prototype.catch真的很奇怪使用try/catch,您已经可以使用await

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

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而使用catchawait,那么它将看起来像:

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 /catchblock将永远不会做任何有用的事情,因为任何问题都会触发.catch方法,并且Promise不会被await处理。最好不要混合使用两种样式-选择awaittry / catch.then.catch,但不要两者都选,否则控制流程可能会变得难以理解。

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论