Mongoose find().exec() 承诺问题 [重复]
Posted
技术标签:
【中文标题】Mongoose find().exec() 承诺问题 [重复]【英文标题】:Mongoose find().exec() promise issue [duplicate] 【发布时间】:2018-10-13 13:20:08 【问题描述】:谁能解释一下为什么下面的代码返回audiences
而不是返回一个空数组?
return Audience.find()
.exec((err, audiences) =>
if (err) return errorHandler.handle('audienceService', err);
return Promise.resolve([]);
);
【问题讨论】:
我可以解释你只是做return Audience().find()
。您正在将“回调”混入您期望返回 Promise
的内容中。 mongoose 方法已经返回了 Promise。
@NeilLunn:That dupetarget 似乎有点牵强,有什么更直接适用于使用exec
的回调方面而不是承诺方面的东西吗?
@T.J.Crowder 剪贴板中的链接错误。本来是规范的,并且还在寻找关于猫鼬exec()
的冗长回复,这应该可以消除额外的混乱。链接已更改。
@NeilLunn: :-) 我不会说the async one 是一个欺骗目标。在我看来,The other 的答案充其量只是切线地解决了这个问题。
【参考方案1】:
您正在从exec
回调返回。要使用来自 exec
的承诺,请在其上使用 then
as shown here。也没有理由Promise.resolve
:
return Audience.find()
.exec()
.then(audiences => [])
.catch(err => errorHandler.handle('audienceService', err));
【讨论】:
这个答案没有解决问题 谢谢你。我一直在尝试使用猫鼬查询完整实现.then()
.catch()
。制作异步功能并等待观众可以吗? @t-j-crowder
@O'DaneBrissett - 如果你有一个承诺,是的,你可以在 async
函数中 await
它。因此,例如,如果它在 async
函数中,则上面可能是 try await Audience.find().exec(); return []; catch (err) errorHandler.handle('audienceService', err);
。
所以基本上一旦异步,你就不能使用.then()
.catch()
你必须包装在一个try catch块中? @t-j-crowder
@O'DaneBrissett - 你可以,只是通常你不想这样做,因为@987654335 的简单流控制语句通常更清晰@ 函数让您可以改用。以上是关于Mongoose find().exec() 承诺问题 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose - find(,cb) 和 find().exec(cb) 有啥区别?
Mongoose:“.find(...).exec(...).then(...).catch(...).finally 不是函数”使用蓝鸟?