问一个问题 mongoose exec() 方法貌似没有必要了?
下面两行现在有区别吗? 5.0.8 版本
Player.find({}).exec()
Player.find({})
加不加 .exec() 都会调用 then 方法? 查看资料都说 exec() 返回 Promise ?但是不加 exec() 也调用 then() 里面的方法。
7 回复
有区别的,一个是返回data一个是返回query,比如你想写一个统一的分页方法,就需要把查询的query传进去分页方法,通过附加其他查询来实现。
@a631807682 通过打印上面两个函数返回值,一个 query ,一个 Promise。
但是
Player.find({}).then(data=>{
console.log(data)
})
Player.find({}).exec().then(data=>{
console.log(data)
})
这俩都可以,都能得到数据
应该是没有 callback 函数就会返回 promise if callback == null, then will return a promise
@a631807682 mongoose 文档里明确写了
Model.find()
Parameters
[callback] «Function»
Returns:
«Query»
Finds documents
The conditions are cast to their respective SchemaTypes before the command is sent.
这个 Query 为啥可以接上 promsie
@hi363138911 自己傻子不看文档
Query.prototype.then()
Parameters
[reject] «Function»
Returns:
«Promise»
Executes the query returning a Promise which will be resolved with either the doc(s) or rejected with the error.
Query.prototype.catch()
Parameters
[reject] «Function»
Returns:
«Promise»
Executes the query returning a Promise which will be resolved with either the doc(s) or rejected with the error. Like .then(), but only takes a rejection handler.
结论确实 exec(); 没什么必要添加了。
@a631807682 是的
没用过,但不排除有用,因为query可以被更改,而exec只能得到结果。就像js对象也有可更改和不可更改的属性的区分,比如你提供一个sdk供人使用,而且返回的是query,并不确定被改成什么。