我有此代码:
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)
,结果仍然相同。
答案 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
变量。