1、現(xiàn)象
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結(jié)果,這是為什么呢,我們先來(lái)看下是什么
async function findByName(name) {
let nameDoc = tankModel.findOne({name: name});
let nameDocT = tankModel.findOne({name: name}).exec();
console.log('nameDoc: ', nameDoc instanceof Promise); //結(jié)果為false
console.log('nameDocT: ', nameDocT instanceof Promise); //結(jié)果為true
}
findByName('jack');
我們看到執(zhí)行exec后,返回的是Promise對(duì)象,而不執(zhí)行exec則不是。
2、原因
findOne.png
我們查看mongoose文檔,findOne方法返回的是Query對(duì)象。Query的exec方法返回的是Promise對(duì)象
exec.png
await后邊可以是 Promise 對(duì)象和原始類型的值(數(shù)值、字符串和布爾值,但這時(shí)會(huì)自動(dòng)轉(zhuǎn)成立即 resolved 的 Promise 對(duì)象),還可以是一個(gè)thenable對(duì)象(即定義then方法的對(duì)象),這時(shí)await會(huì)將其等同于 Promise 對(duì)象。
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));
執(zhí)行結(jié)果為:
start....
time end...
那我們來(lái)看看Query是否也是一個(gè)thenable對(duì)象呢(Query的then方法)
then.png
3、結(jié)論
我們可知,在async函數(shù)await后邊查找結(jié)果,帶不帶exec都可以,只不過(guò)一個(gè)返回的是真正的Promise對(duì)象,一個(gè)是偽Promise對(duì)象。