如何在 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) =>{

还是没关系?也就是说,它的工作原理是一样的,即使我没有在 user.findOne 前面写 await 使用 'then'?


非常感谢您的阅读。


月关宝盒
浏览 434回答 2
2回答

米脂

一般情况下,单块内,你应该要么使用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,但不能同时使用,否则控制流可能变得难以理解。

肥皂起泡泡

首先, 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)   }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript