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 不是函数”使用蓝鸟?

如何使用带有 Mongoose 和 ES6 承诺的 Graphql 中的 find 来解析多条记录

Mongoose - 删除使用承诺找到的所有文档

Mongoose exec() 没有正确等待

在更新使用 Mongoose 模型检索并作为承诺处理的文档时遇到问题