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

用户名

我花了几个小时试图使下面的异步请求正常工作,并且在学习了大量有关异步请求,猫鼬和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;谁能帮我理解为什么?

尤里·塔拉班波(Yury Tarabanko)

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

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

然后,您的函数将返回未定义。应该返回与await正确互动的承诺

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在函数内部修改变量后,为什么变量未更改?-异步代码参考

NgWebDriver仅在重新加载页面后才能工作。为什么?

为什么为puppeteer使用这种异步函数语法?

为什么调用task.run函数时我的异步函数挂起

为什么在promise then子句中调用我的Sinn间谍函数不能正常工作?

为什么我的Javascript增量运算符(++)在我的addOne函数中无法正常工作

为什么我的href仅在手动刷新页面后才能工作?

我的JavaScript函数仅在我强制刷新页面后才能工作

为什么我的removeNumbersLessThan函数不能正常工作?

为什么JavaScrips仅在加载页面后才能工作?

为什么我的异步等待无法正常工作

为什么我的代码中的fprintf()函数无法正常工作?

为什么该函数调用抛出“等待仅在异步函数中有效”的语法错误,即使该函数是异步的?

为什么setInterval函数不能正常工作?

为什么我递归调用python函数时无法正常工作?

为什么我需要这段代码中的time.sleep(x)函数才能使其正常工作?

Javascript onclick函数仅在异步请求后才能工作。

Javascript,为什么我的onclick函数无法正常工作

为什么我的checkall函数可以工作,但是uncheckall函数不能正常工作

为什么我不能调用我的函数?

为什么函数strcat无法正常工作?

为什么我的构造函数无法正常工作?

为什么插入printf语句会使我的函数正常工作?

为什么我的js仅在刷新页面后才能正常工作?

函数仅在首次调用时才能正常工作

为什么我的 parseFloat 函数不能正常工作?

为什么我的 round 函数不能正常工作?

为什么我的 await 在我的功能中不起作用?“语法错误:等待仅在异步函数中有效”

为什么我的 jQuery 应用程序仅在页面刷新后才能工作?