Promise.all не возвращает реальные результаты - PullRequest
0 голосов
/ 08 мая 2019

У меня есть этот код:

  let result = programBenef.map(async item => {
    const beneficiary = await Beneficiary.findById(item.beneficiary_id);
    delete item.beneficiary_id;
    return {
      ...item,
      ...beneficiary
    };
  });

  result = await Promise.all(result);

console.log(result);

, и когда я делаю console.log (результат), у меня есть этот результат:

  Promise {
    { '$__': [InternalCache],
      isNew: false,
      errors: undefined,
      _doc: [Object],
      '$init': true } },
  Promise {
    { '$__': [InternalCache],
      isNew: false,
      errors: undefined,
      _doc: [Object],
      '$init': true } }

Почему он не возвращает фактический результат, И как ее решить?

РЕДАКТИРОВАТЬ 1: Это целая функция:

router.get("/getProgramDistr/:id", auth, async (req, res) => {
  if (req.user.roles === 1) return res.status(403);
  if (!req.params.id) return res.status(400);

  const admin_id = req.user.father_id || req.user._id;
  const programDistr = await ProgramDistributor.find({
    admin_id,
    program_id: req.params.id
  });
  if (!programDistr) return res.status(404);

  let result = await programDistr.map(async item => {
    const beneficiary = await Distributor.findById(item.distributor_id);
    delete item.distributor_id;
    return {
      ...item,
      ...beneficiary
    };
  });

  result = await Promise.all(result);

  // console.log(result, "this is the result");

  return res.send(result);
});

Я пытался использовать for loop вместо карты и выдвигать обещания в массивзатем позвоните Promise.all(array) и получите тот же результат.

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Это может быть решение, которое вы ищете

const promises = programDistr.map(async item => Distributor.findById(item.beneficiary_id).lean() );

const results = await Promise.all(promises);

return res.send(results);

Разбивка


programDistr.map(async item => Distributor.findById(item.beneficiary_id).lean() );
Это возвращает массив обещаний, которые запросят базу данных для Дистрибьютора с совпадающим идентификатором beneficiary_id.
lean() - это запрос мангусты, который просто возвращает необработанные документы (которые, как я полагаю вы собираетесь получить , а пропустит ваш последний вызов map для объектов _doc ). документация по мангустову

await Promise.all(promises)
ожидает завершения всех запросов и возвращает в переменную results.

0 голосов
/ 08 мая 2019

Чтобы решить эту проблему, я изменил код, чтобы он стал примерно таким:

  const result = programDistr.map(async item => {
    const distributor = await Distributor.findById(item.beneficiary_id);
    delete item.beneficiary_id;
    return {
      ...item,
      ...distributor
    };
  });

  const outcome = await Promise.all(result);

  let resss = outcome.map(item => {
    return item._doc;
  });

  return res.send(resss);

Результат по-прежнему дает мне странно выглядящий массив с объектом в каждом из индексов массива, но при переборе по массиву и получении значения ключа item._doc я нашел фактические результаты.

Но, тем не менее, почему promise.all () не может вернуть фактический результат?

...