下面是检索用户仪表板信息的途径。我试图避免嵌套所有的Promise(我听到它叫回调地狱),但仍然得到正确的结果。我假设下面的代码片段不返回任何内容,因为在运行时,它超出了所有promise,并且仅在promise有机会解决之前返回了三个空数组。我尝试使用async / await并没有成功,并且不确定是否这正是我所需要的。在这种给定的情况下,处理这些承诺并一次返回所有结果的最佳实践是什么?
// @route GET api/user/dashboard
// @desc Retrieve all of the user's dashboard info
// @access Private
router.get("/dashboard",
passport.authenticate("jwt", { session: false }),
(req, res) => {
const donations = [];
const events = [];
const teams = [];
req.user.donations.forEach(donation_id => {
Donation.findOne({ _id: donation_id })
.then(donation => {
if (donation) {
donations.push(donation);
}
})
.catch(err => console.log(err));
});
req.user.events.forEach(event_id => {
Event.findOne({ _id: event_id })
.then(event => {
if (event) {
events.push(event);
}
})
.catch(err => console.log(err));
});
req.user.teams.forEach(team_id => {
Team.findOne({ _id: team_id })
.then(team => {
if (team) {
teams.push(team);
}
})
.catch(err => console.log(err));
});
return res.status(200).json({ data: { donations, events, teams } });
}
);
答案 0 :(得分:2)
使用Promise.all
等待所有Promises
首先解决。您需要将每个donation
(以及event
和team
)映射到Promise
,以便可以在{{1 }},然后需要在这三个组上调用Promise.all
。
因为Promise
,Promise.all
和donations
都需要类似的东西(从数组中提取events
属性,所以用{{ 1}},并过滤所有结果),最好将所有内容抽象为一个函数,以使代码保持DRY:
teams
没有_id
和.findOne
:
_id