繁体   English   中英

为什么我的异步函数仅在更改被调用函数的语法后才能正常工作?

[英]Why does my Async function only work correctly when I change my called functions syntax?

我花了几个小时试图使下面的异步请求正常工作,并且在学习了大量有关异步请求,猫鼬和node.js的知识之后,事实证明我的问题或多或少是一个语法问题(因为我可以理解)。

谁能告诉我为什么此代码有效,但我的原始代码却无效?

工作代码:

router.get('/usercheck', function(req, res) {
  var usr = Person.findOne({username: req.query.u}, function(err, user){
    if(user != null){
      return user
    }else return null
  })
   var eml = Person.findOne({email: req.query.e}, function(err, user){
     if(user != null) {
       return user
     }else return null
   });
   var resolve = function(e, u){
     if(e === null && u === null) res.sendStatus(200) //Both available
     else if (e === null && u != null) res.sendStatus(409) //"Email free, user taken"
     else if (e != null && u === null) res.sendStatus(403) //"Email taken, user free"
     else if (e!=null && u!=null) res.sendStatus(418) //"Email and user taken"
     else res.sendStatus(500) // Something broke, no idea what
   }
   async function handler() {
       const user = await usr;
       const email = await eml;
       return resolve(email, user);
   }
   handler();
 });

原始代码:

router.get('/usercheck', function(req, res) {
  function usr() {
    Person.findOne({username: req.query.u}, function(err, user){
      if(user != null){
        return user
      }else return null
    })
  }
  function eml(){
    Person.findOne({email: req.query.e}, function(err, user){
      if(user != null) {
        return user
      }else return null
    });
  }
  var resolve = function(e, u){
    if(e === null && u === null) res.sendStatus(200) //Both available
    else if (e === null && u != null) res.sendStatus(409) //"Email free, user taken"
    else if (e != null && u === null) res.sendStatus(403) //"Email taken, user free"
    else if (e!=null && u!=null) res.sendStatus(418) //"Email and user taken"
    else res.sendStatus(500) // Something broke, no idea what
  }
  async function handler() {
      const user = await usr();
      const email = await eml();
      return resolve(email, user);
  }
  handler();
});

我敢肯定这是有逻辑的,但是我对atm并不了解。 就我的理解而言,两种版本的代码中的return语句都应传递给resolve(),后者应对其进行评估。

但是,使用第二个原始实现,根本没有任何东西传递给resolve(),if else循环失败,并发送回退错误500; 谁能帮我理解原因?

首先,您要么坚持承诺,要么回调。

var usr = Person.findOne({username: req.query.u}).exec() // do not need a nodeback

然后,您的函数将返回未定义。 应该返回一个承诺为w交互/ await正确

function usr() {
  // return!
  return Person.findOne({username: req.query.u}).exec()
}

如此多的问题...对于初学者而言,异步函数将返回值包装为Promise,因此您在handler()中实际返回的内容是未解决的Promise。

因此将function(req, res)转换为异步版本并await handler()或调用

handler().then(cb)

您还应该在猫鼬模型中坚持回调或Promise。 如果省略回调,则调用Model.find/delete/insert()的返回结果通常是一个承诺。

我建议将代码重构为类似的东西。

router.get('/usercheck', async function(req, res) {
  const { u:username, e:email } = req.query;
  try {
    const { username:u, email:e } = await Person.findOne({ username, email });
    if(e && u) {
       res.status(200) //Both available
    }
    else if (e && !u) {
       res.status(409) //"Email free, user taken"
    }
    else if (!e && u) {
       res.status(403) //"Email taken, user free"
    }
    else if (e!=null && u!=null) {
       res.status(418)
    }
  } catch(e) {
    res.status(500).json(e);
  }
});

对于编写的代码的样式和清晰度,我有很多不满意的地方,但是在第二种情况下未获得结果的原因仅仅是因为您没有从usr()eml()职能。 应该通过前缀来解决return立即之前Person.findOne(...线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM