如何在快递路线中返回多个诺言的结果?

时间:2018-08-02 00:14:23

标签: node.js express

下面是检索用户仪表板信息的途径。我试图避免嵌套所有的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 } });
  }
);

1 个答案:

答案 0 :(得分:2)

使用Promise.all等待所有Promises首先解决。您需要将每个donation(以及eventteam)映射到Promise,以便可以在{{1 }},然后需要在这三个组上调用Promise.all

因为PromisePromise.alldonations都需要类似的东西(从数组中提取events属性,所以用{{ 1}},并过滤所有结果),最好将所有内容抽象为一个函数,以使代码保持DRY:

teams

没有_id.findOne

_id