【发布时间】:2017-09-27 15:17:32
【问题描述】:
我正在处理一个非常复杂的项目,其中必须处理大量 mongoDB 查询才能显示数据。目前,在对大量数据执行查询时,并非所有数据都会在页面加载后立即显示。现在我通过设置超时函数来解决这个问题,然后再使用next() 函数。
所以这是调用其中一个函数的地方:
router.get('/playwall', account.checkSession, playwalls.get, function(req, res, next) {
res.render('dashboard/playwalls/index');
});
检查用户是否登录后,playwalls.get 函数会触发。这就是该功能现在的工作方式:
const playwalls = {
/* GET ALL PLAYWALLS FOR THAT USER, FOR ADMIN GET THEM ALL
-------------------------------------------------------------- */
get(req, res, next) {
req.session.playwalls = [];
const dataCollection = db.collection('data');
const data = dataCollection.find({});
console.log(typeof data)
const today = new Date();
data.forEach(function(d) {
console.log(data.length)
if(d.admin == req.session.userData.username || req.session.userData.role == 'admin') {
const expireDate = new Date(d.date);
if(expireDate < today && d.status == 'actief') {
playwalls.editStatus(d, req, res, next);
}
req.session.playwalls.push(d);
}
})
setTimeout(function() {
next();
}, 1000)
},
// Here the rest of the methods
}
我的问题是;我怎样才能确保next() 函数仅在data.forEach 循环已处理查询返回的所有文档时才被触发?这样我就可以摆脱setTimeout() 函数了。
希望我的问题很清楚,有人可以帮助我。我在互联网上四处寻找,但找不到正确的答案。
提前致谢!
【问题讨论】:
-
你可以使用
promises -
您可以将完成执行所需的代码包装在一个 Promise 中。 IE。将 forEach 放入一个单独的函数中,该函数返回一个 Promise,然后在它当前所在的位置解析它并调用 next
-
你应该开始使用
promises。但你也可以查看async回调库 -
感谢您的所有回答,这些对我来说都是新事物。但我会更多地了解他们!谢谢!
-
是的,承诺。特别是,寻找“Promise.all()”......你的代码看起来有点像
Promise.all(editResponses).then(next)
标签: javascript node.js mongodb loops settimeout