背景:Market
集合具有url
属性,该属性存储来自sites
集合中所选Site
的网址数组。我创建了一个帮助器(下面的代码),我可以从/routes/markets.js
调用它基本上根据Market
选择req.params.url
然后遍历market.sites
数组并找到相应的{ {1}},将它们存储到我可以在渲染视图时使用的数组中。
问题:调用数组上的Site
函数并没有实际推送任何内容,而在上一个push
语句中我只记录console.log
问题:如何推入此阵列?这是[]
循环和for of
then
调用的问题吗?
市场helpers.js
Promise
路由/ markets.js
exports.listSites = (req, res, errorRender, successRender) => {
let sites = [];
Market.find({url: req.params.url})
.then((market) => {
for (url of market[0].sites)
Site.find({url}).then((site) => {
sites.push(site[0]);
}).catch((err) => console.log(err));
console.log(sites);
res.render(successRender, {sites});
})
.catch((errors) => {
res.render(errorRender, {errors});
});
};
答案 0 :(得分:1)
Site.find({url})
是异步操作,因此在等待异步操作的结果之前执行res.send
。您可以使用Promise.all
等待所有异步操作的结果,一旦所有异步操作都得到解决,您可以按如下方式返回响应:
exports.listSites = (req, res, errorRender, successRender) => {
let sites = [];
Market.find({url: req.params.url})
.then((market) => {
const promises = [];
for (url of market[0].sites)
promises.push(Site.find({url}).then((site) => sites.push(site[0])));
return Promise.all(promises).then(() => {
console.log(sites);
res.render(successRender, {sites});
});
})
.catch((errors) => {
res.render(errorRender, {errors});
});
};