【问题标题】:Mongoose find().exec() promise issue [duplicate]Mongoose find().exec() 承诺问题 [重复]
【发布时间】: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 的答案充其量只是切线地解决了这个问题。

标签: javascript mongodb mongoose es6-promise


【解决方案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 的简单流控制语句通常更清晰@ 函数让您可以改用。
猜你喜欢
  • 2020-12-15
  • 1970-01-01
  • 2018-07-02
  • 2015-03-01
  • 2021-10-23
  • 2023-03-26
  • 1970-01-01
  • 2015-01-21
  • 2016-05-20
相关资源
最近更新 更多