promise.all不返回实际结果

时间:2019-05-08 15:11:24

标签: dictionary asynchronous mongoose promise async-await

我有此代码:

  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(result)时,我得到以下结果:

  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而不是map并将promise推入数组,然后调用Promise.all(array),结果仍然相同。

2 个答案:

答案 0 :(得分:0)

为解决此问题,我将代码更改为如下形式:

  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()为什么不能返回实际结果?

答案 1 :(得分:0)

这可能是您正在寻找的解决方案

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() );
这将返回一个promise数组,该数组将使用匹配的beneficiary_id在数据库中查询分发服务器。
lean()是一个猫鼬查询,仅返回原始文档(我相信您要使用会省略对map的最后一次调用到_doc对象)。 mongoose lean documentation

await Promise.all(promises)
等待所有查询完成并返回到results变量。