Return действительно ждет двух ожиданий в одной и той же функции. Javasript - PullRequest
1 голос
/ 12 марта 2020

Эй, ребята, я новичок в nodeJS и mongoDb. Так что у меня есть некоторые проблемы с этим кодом, которые, кажется, работают для других людей, так как это часть учебника, но не для меня. Проблема в функции followThisUser. Я убедился, что return не ждет, пока переменным «follow» и «follow» присвоено значение. И он просто возвращает их как неопределенные. Если бы кто-то мог помочь мне понять, почему это происходит, а также дать мне решение, я был бы очень рад.

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
      })
    })
  })
}

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Во-первых, await делает что-то полезное, только если вы ожидаете обещание.

Во-вторых, в понедельник goose, model.findOne().exec() возвращает ТОЛЬКО обещание, если вы НЕ передаете обратный вызов .exec(). Если вы передаете обратный вызов (как вы делаете), он передает завершение или ошибку через этот обратный вызов, и обещание не возвращается. Таким образом, ваши await операторы ничего не делают.

Итак, чтобы получить обещания от .exec() и дать await возможность сделать что-то полезное, удалите обратный вызов из .exec().

0 голосов
/ 12 марта 2020

Похоже, здесь есть некоторая путаница относительно использования await здесь.

Мой ответ на этот понедельник goose вопрос может помочь вам понять, как await, Promises и обратные вызовы в стиле Node работают вместе.

Проблема

findOne - это асинхронная функция.

Есть 3 способа получить уведомление о готовности вернуть значение: 1. Возьмите возвращаемое обещание и используйте .then()

Follow.findOne({})
  .then(data => {doSomething()});
Дайте findOne обратный вызов
Follow.findOne({}, (err, data) => {doSomething()});
Используйте .exec(). это работает как один из двух описанных выше случаев

Вы также можете использовать await с формой Promise вместо .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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...