【问题标题】:Return does wait for two awaits in the same function. JavaSriptReturn 确实在同一个函数中等待两个等待。 JavaScript
【发布时间】:2020-06-24 00:52:11
【问题描述】:

大家好,我是 nodeJS 和 mongoDb 的新手。所以我对这段代码有一些问题,这似乎对其他人有用,因为它是教程的一部分,但不适合我。问题出在函数“followThisUser”中,我已经验证了返回,不会等到“following”和“followed”变量被赋值。它只是将它们返回为未定义。如果有人可以帮助我理解为什么会发生这种情况,并给我一个解决方案,我会非常满意。

async function followThisUser(indentity_user_id, user_id) {
  var following = await Follow.findOne({
    user: indentity_user_id,
    followed: user_id
  }).exec((err, follow) => {
    if (err) return handleError(err);
    return follow;
  });

  var followed = await Follow.findOne({
    user: user_id,
    followed: indentity_user_id
  }).exec((err, follow) => {
    if (err) return handleError(err);
    return follow;
  })

  return {
    following,
    followed
  }
}

function getUser(req, res) {
  var userId = req.params.id

  User.findById(userId, (err, user) => {
    if (err) return res.status(500).send({
      message: 'Error en la petición'
    })
    if (!user) return res.status(404).send({
      message: 'Error el usuario no existe'
    })

    followThisUser(req.user.sub, userId).then((value) => {
      user.password = undefined;
      return res.status(200).send({
        user,
        value
      })
    })
  })
}

【问题讨论】:

  • 这里没有人知道 FollowUser 是什么,或者它们的实现对于您所询问的内容可能是必不可少的,因此您不太可能得到原样的答复.
  • @SeanKinsey FollowUser 在我看来像是收藏
  • 他们当然可以,但是我们知道的收藏有效吗?具有符合 OP 期望的内容的集合?现在,如果这些集合是空的,undefined/undefined 似乎是正确的结果?
  • console.log(follow) 添加到.exec() 回调函数中,以确保它们返回一些内容。
  • 呼叫.exec() 不带参数。将错误处理为来自.exec()返回的Promise对象的拒绝

标签: javascript node.js mongoose


【解决方案1】:

首先,await 仅在您等待承诺时才会做一些有用的事情。

其次,在猫鼬中,model.findOne().exec() 仅在您未将回调传递给 .exec() 时才返回承诺。如果您传递回调(正如您所做的那样),它会通过该回调传达完成或错误,并且不会返回任何承诺。因此,您的 await 语句没有做任何事情。

所以,要从 .exec() 获得承诺并让 await 有机会做一些有用的事情,请从 .exec() 中删除回调。

【讨论】:

    【解决方案2】:

    这里关于await 的使用似乎有些混乱。

    我的answer to this Mongoose question 可以帮助您了解await、Promises 和 Node 样式的回调如何协同工作。

    问题

    findOne 是一个异步函数。

    有 3 种方法可以通知它已准备好返回值: 1.接受它返回的Promise并使用.then()

    Follow.findOne({})
      .then(data => {doSomething()});
    
    1. findOne一个回调
    Follow.findOne({}, (err, data) => {doSomething()});
    
    1. 使用.exec()。这类似于上述两种情况之一

    您也可以将 await 与 Promise-form 一起使用,而不是 .then(),例如

    await Follow.findOne({});
    doSomething();
    

    问题在于您既传递了回调,也传递了await结果。

    解决方案

    不要将回调传递给.exec()

      var following = await Follow.findOne({
        user: indentity_user_id,
        followed: user_id
      }).exec();
    
      var followed = await Follow.findOne({
        user: user_id,
        followed: indentity_user_id
      }).exec();
    

    【讨论】:

      猜你喜欢
      • 2021-10-02
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 2015-03-15
      • 2019-02-16
      • 1970-01-01
      相关资源
      最近更新 更多