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() 承诺问题 [重复]的主要内容,如果未能解决你的问题,请参考以下文章