最近使用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;
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐