Javascript Mongoose中的Find()调用

Javascript Mongoose中的Find()调用,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,这些调用的区别是什么?为什么在第一种情况下,我的控制台记录为“未定义”,而在第二种情况下,我得到了正确的答案(一个整数) 调用count()时-未定义 function count() { let answer; Url.findOne({}).sort({short_url:-1}).exec(function (err,ur) { if (err) return err; answer = ur.short_url }); console.log(answer); } 调用co

这些调用的区别是什么?为什么在第一种情况下,我的控制台记录为“未定义”,而在第二种情况下,我得到了正确的答案(一个整数)

调用count()时-未定义

function count() {
  let answer;
  Url.findOne({}).sort({short_url:-1}).exec(function (err,ur) { if (err) return err; answer = ur.short_url });
  console.log(answer);
}
调用count()时-一个整数

function count() {

  Url.findOne({}).sort({short_url:-1}).exec(function (err,ur) { if (err) return err; console.log(ur.short_url) });

}

一般来说,我希望实现这样一个调用(count())将返回“short_url”的最高值。

findOne调用是异步的。因此,在返回
findOnde
语句之前调用
console.log
语句

第二个是您正在使用回调。这意味着当
findOne
函数完成时,调用此函数。这一次,它将起作用

但作为最佳实践,我建议您使用
async
wait
,如果您使用的是ES6JavaScript

async function count() {
   let answer;
   await Url.findOne({}).sort({short_url:-1}).exec(function (err,ur) { if (err) return err; answer = ur.short_url });
   console.log(answer);
}
贝雷克特是对的

您也可以使用回调

function count() {
   let answer;
   await Url.findOne({}).sort({short_url:-1}).exec(function (err,ur) { 
       if (err) return err; 
       answer = ur.short_url
       console.log(answer);
    });
}
或者有承诺

function count() {
   let answer;
   await Url.findOne({}).sort({short_url:-1}).exec().then((ans) => {
       console.log(ans);
   }).catch(err => {
       console.log(err);
   });
}
但是count()仍然是异步的,因此不会立即打印


您应该深入了解

进一步了解javascript的本质会很有用,其中控制流、闭包、作用域是理解异步代码将来如何执行的关键

function count() {
  //count function scope

  let answer; //undefined at execution

  Url.findOne({}).sort({short_url:-1}).exec(function (err,ur) {

   //callback function scope 

   if (err) return err; 
  //answer is still undefined

  answer = ur.short_url 

  //answer is assigned ur.short_url only in the callback scope 
  //answer is defined here, and will print the content
  console.log(answer);

  });
  //back to count function scope
  //answer is still undefined in this scope (called function scope)
  console.log(answer);
   }
如果要返回查询的值,可以使用带有async的return语句

async function count() {
  const answer = await Url.findOne({}).sort({short_url:-1});

  console.log(answer);      //logs answer

  return answer;
}

同样重要的是要知道,只能从
async
函数上下文中执行
wait
一个
async
函数。看看这个:事实上。。在下面的Asaf Aviv回答中,我评论说您的解决方案在我的情况下运行良好,但它只在某些情况下运行。请看地图。在这种情况下,我没有定义。如果我丢失了'shortInt'变量,并直接输入console.log(result)。然后(…)调用,我会得到正确的值。怎么回事?基本上,我需要确保得到正确的答案,因为稍后在代码中,我会将其递增1,并用新值保存新记录。@nenene Tnx,但我已签出链接,它将打印未定义的内容。这是因为函数count()是异步定义的。这意味着它仍在回报承诺。检查此链接。。。是的,我一直在阅读这篇文章和其他各种来源,据我所知,你的解决方案就是这里所描述的。它应该等到值被解析,但显然缺少了一些东西。