Массив пуст на карте, возвращая обещание - NODE JS - PullRequest
1 голос
/ 13 апреля 2020

Я новичок ie в этом. Моя проблема, когда я пытался вернуть массив, полный значений, он вернулся пустым. Я столкнулся с этим несколько недель назад и решил, объявив карту как const и вернув ее значение в функции ... но я не могу вспомнить, как я это сделал.

Это мой код:

module.exports.deleteLockedEmail = (req, res, next) => {
  const maxDateAd = new Date().getTime() - 2592000000;
  const adIdsToDelete = [];
  Admin.find({})
    .then(emailLocked => {
      const mapToLockedEm =  emailLocked.map(element => {
        return User.findOne({email:element.email})
                .then(userLocked => {
                  return adIdsToDelete.push(userLocked)
                })
                .catch(error => console.log(error))
      })
      return mapToLockedEm
    })
    .catch(error => console.log(error))

  cron.schedule("* * * * *", function() {
  console.log("running a task every minute => delete locked ads");
  });
}

Как мне заполнить этот массив?

adIdsToDelete = [];

1 Ответ

2 голосов
/ 13 апреля 2020

Помните, что все эти обращения к базе данных являются асинхронными. Чтобы получить значения, нужно дождаться разрешения обещания и вернуть значения. В этом случае мы можем дождаться выполнения всех Обещаний с Promise.all, а затем в следующем then контексте

module.exports.deleteLockedEmail = (req, res, next) => {
  const maxDateAd = new Date().getTime() - 2592000000;
  const adIdsToDelete = [];
  Admin.find({})
    .then(emailLocked => {
      const mapToLockedEm =  emailLocked.map(element => {
        return User.findOne({email:element.email})
                .then(userLocked => {
                  return adIdsToDelete.push(userLocked)
                })
                .catch(error => console.log(error))
      })
      return Promise.all(mapToLockedEm)
    }).then(() => {
      // In this context the adIdsToDelete will be filled
    });
    .catch(error => console.log(error))

  cron.schedule("* * * * *", function() {
  console.log("running a task every minute => delete locked ads");
  });
}

Кроме того, в общем случае работать с такими переменными, как * 1005, может быть немного сложно. * поскольку они находятся в другой области, чем ваша цепочка обещаний. Как это произошло в вашем примере - это может сбивать с толку, когда эта переменная фактически заполняется значениями.

Вы можете переписать ее следующим образом

module.exports.deleteLockedEmail = (req, res, next) => {
  const maxDateAd = new Date().getTime() - 2592000000;
  Admin.find({})
    .then(emailLocked => {
      const mapToLockedEm =  emailLocked.map(element => {
        return User.findOne({email:element.email})
                .catch(error => console.log(error))
      })
      return Promise.all(mapToLockedEm)
    }).then(adIdsToDelete  => {
      // In this context the adIdsToDelete will be filled
    });
    .catch(error => console.log(error))

  cron.schedule("* * * * *", function() {
  console.log("running a task every minute => delete locked ads");
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...