美文网首页程序员
mongoose在async函数用不用使用exec方法

mongoose在async函数用不用使用exec方法

作者: 冯艳辉brook | 来源:发表于2020-05-09 17:04 被阅读0次

1、现象

var schema = new mongoose.Schema({ name: 'string', size: 'string' });
var tankModel = mongoose.model('tank', schema);

mongoose查找方法

async function findByName(name) {
  let nameDoc = await tankModel.findOne({name: name});
  let nameDocT = await tankModel.findOne({name: name}).exec();

  console.log('nameDoc: ', nameDoc);
  console.log('nameDocT: ', nameDocT);
}
findByName('jack');

上边方法中,最后带exec和不带exec都可以得到doc结果,这是为什么呢,我们先来看下是什么

async function findByName(name) {
  let nameDoc = tankModel.findOne({name: name});
  let nameDocT = tankModel.findOne({name: name}).exec();

  console.log('nameDoc: ', nameDoc instanceof Promise); //结果为false
  console.log('nameDocT: ', nameDocT instanceof Promise); //结果为true
}
findByName('jack');

我们看到执行exec后,返回的是Promise对象,而不执行exec则不是。

2、原因

findOne.png

我们查看mongoose文档,findOne方法返回的是Query对象。Query的exec方法返回的是Promise对象

exec.png 那么Query既然不是Promise对象,为什么会在async函数的await命令后执行呢?我们先看看哪些可以在await后边(参考阮一峰老师的ES6入门
await后边可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即 resolved 的 Promise 对象),还可以是一个thenable对象(即定义then方法的对象),这时await会将其等同于 Promise 对象。
function print() {}
print.prototype.then = function (resolve, reject) {
  setTimeout(function () {
    console.log('start....');
    resolve('ddd');
  }, 1000)
};

async function main() {
  await new print();
  console.log('time end...')
}
main().catch(err => console.log('err--->', err));

执行结果为:

start....
time end...

那我们来看看Query是否也是一个thenable对象呢(Query的then方法

then.png 我们看到,Query确实是一个thenable对象,同时它执行完之后会返回一个真正的Promise对象。

3、结论

我们可知,在async函数await后边查找结果,带不带exec都可以,只不过一个返回的是真正的Promise对象,一个是伪Promise对象。

相关文章

  • mongoose在async函数用不用使用exec方法

    1、现象 mongoose查找方法 上边方法中,最后带exec和不带exec都可以得到doc结果,这是为什么呢,我...

  • ES7 Async/Await快速入门

    用法: 使用async 声明函数,在async函数内使用await async function xxx(){aw...

  • 2020-04-15 async 函数

    async 函数 异步操作函数 1.基本用法 async函数返回一个 Promise 对象,可以使用then方法添...

  • 想搞懂async?先从单向链表讲起

    async怎么用 async函数返回一个Promise对象,可以使用then方法添加回调函数。当函数执行的时候,一...

  • async和await的使用

    async函数 什么是async函数? async函数是使用async关键字声明的函数。 mdn文档:https:...

  • async/await 怎么用,如何捕获异常?

    async函数是Generator函数的语法糖。使用 关键字async来表示,在函数内部使用await来表示异步。...

  • ES8(13)、await 和 async 的用法

    async函数是使用async关键字声明的函数。 async函数是AsyncFunction构造函数的实例, 并且...

  • ES7 async await

    async await:用同步的方式来写异步async函数返回一个 Promise 对象,可以使用then方法添加...

  • async和await

    async作用 async声明function是一个异步函数,返回一个promise对象,可以使用 then 方法...

  • PHP的exec()

    php中可以使用 exec() 函数调用外部函数。 语法: string exec ( string $comma...

网友评论

    本文标题:mongoose在async函数用不用使用exec方法

    本文链接:https://www.haomeiwen.com/subject/mgwknhtx.html