首页 > 解决方案 > 猫鼬承诺文档说查询不是承诺?

问题描述

来自文档(Mongoose v5.4.1,最新版本):

Mongoose 异步操作,如 .save() 和查询,返回 thenables。这意味着您可以执行 MyModel.findOne({}).then() 之类的操作

文档中的第二段指出:

Mongoose 查询不是承诺。为了方便起见,它们有一个用于 co 和 async/await 的 .then() 函数。

Javascript MDN网页说明了什么:

then() 方法返回一个 Promise。

这是否意味着 mongoose 对异步函数有另一种实现,它们为异步操作的结果保留 then 关键字?

换句话说,它们表现得像 Promise,但不是 JS Promise?

标签: javascriptnode.jsmongodbmongoosepromise

解决方案


文档中:

Mongoose 查询不是承诺。为了方便起见,它们具有.then()co 和 async/await 的功能。但是,与 promise 不同,调用查询.then()可以多次执行查询。

因此,与实际的承诺不同,如果您then()在查询上多次调用,您实际上会多次执行查询(或更新)。

如果您想要一个实际的承诺,请调用exec()查询。

let promise = Test.findOne({}).exec();

推荐阅读