最近使用mongodb数据库做项目,遇到了promise,这里有些不太明白,一直以为promise是异步api呢,因为可以调用then和catch方法。
先说答案:promise本身是同步。但是promise的回调then和catch是异步的。
1.promise 本身是同步的
let promise = new Promise((resolve, reject) => {
console.log(1);
})
console.log(2);
console.log(promise);
这里我们可以看到,先打印1,在打印2,最后打印promise对象,代码向上往下一次执行,这就说明promise是同步代码。
2.promise的回调then,catch是异步
let promise = new Promise((resolve, reject) => {
console.log(1);
resolve(3)
})
promise.then((resolve) => {
console.log(resolve);
})
console.log(2);
这里我们看到先打印1,后跳过回调,直接执行2,最后执行回函数,最终打印出1 2 3 。
以上代码足矣解释promise是异步还是同步。
最后分享一下我的尴尬时刻!!!关于mongodb数据库的查询,如果有和我一样在此遇到困惑的同学,希望可以帮到你~
mongodb数据库的连接
// 引入mongoose第三方模块 用来操作数据库
const mongoose = require('mongoose');
// 数据库连接
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true })
// 连接成功
.then(() => console.log('数据库连接成功'))
// 连接失败
.catch(err => console.log(err, '数据库连接失败'));
查询数据库中的数据
// findOne方法返回一条文档 默认返回当前集合中的第一条文档
pp = User.findOne({ name: 'MM' })
console.log(pp);
这里我纠结 了好久,这里的pp应该打印的是关于查询到的promise对象,可以控制台打印出一堆不知道什么鬼东西,其实还是promise没有理解透彻的原因,这里使用数据库查询语句本质是还是同步的,因为没有用到then方法,但是上面的数据库连接代码用到了then方法,所以是异步的,这就导致控制台先执行pp的打印操作,在进行数据库的连接操作,此时,数据库都没有连接上,肯定就是打印一堆鬼东西了。。。。
解决方法1
在查询语句后面使用then方法,将结果打印出来。
User.findOne({ name: 'MM' }).tnen((doc)=>console.log(doc))
解决方法2
把这个语句封装在一个函数里面,然后使用await关键字,等待数据库连接并且promise返回结果。最后将查询到的结果返回。
function async fn(){
let pp=await User.findOne({ name: 'MM' })
return pp;
}