データを表示するために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
}
私の質問は、 data.forEach
ループがクエリによって返されたすべてのドキュメントを処理した場合にのみ、next()
関数が起動されることを確認するにはどうすればよいですか?だから私はsetTimeout()
機能を取り除くことができます。
私の質問は明確で誰かが私を助けることを願っています。私はインターネット上を見回しましたが、適切な答えを見つけることができませんでした。
ありがとうございます!
あなたは使えます – Mekicha
約束通りに実行する必要があるコードをラップすることができます。私。 forEachを約束を返す別の関数に入れ、現在位置している場所でそれを解決し、次に呼び出す – bazzells
'promises'を使うべきです。しかし、コールバックのために 'async'ライブラリを見ることもできます – sidgate