问一个问题 mongoose exec() 方法貌似没有必要了?
发布于 13 天前 作者 liangtongzhuo 314 次浏览 来自 问答

下面两行现在有区别吗? 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(); 没什么必要添加了。

没用过,但不排除有用,因为query可以被更改,而exec只能得到结果。就像js对象也有可更改和不可更改的属性的区分,比如你提供一个sdk供人使用,而且返回的是query,并不确定被改成什么。

回到顶部