我正在處理一個非常複雜的項目,其中需要處理大量mongoDB查詢以顯示數據。現在,當對大量數據執行查詢時,一旦頁面加載,並非所有數據都會顯示。現在我在使用next()
函數之前通過設置超時函數來解決該問題。等待所有來自mongoDB查詢的項目在繼續之前處理
因此,這是其中一個功能叫:
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()
的功能。
希望我的問題很清楚,有人可以幫助我。我在網上瀏覽過,但找不到合適的答案。
在此先感謝!
你可以用'promise's – Mekicha
你可以換你需要有完成的承諾執行代碼。即將forEach放入一個單獨的函數,返回一個promise,然後將其解析到當前所在的位置,然後調用 – bazzells
u應該開始使用'promises'。但你也可以看'異步'庫回調 – sidgate