我在引用Node.JS的异步行为时遇到了问题:
我正在尝试使用Mongo数据库中的数据填充数组并将其发送到页面。当然Array是空的,我想知道它是如何解决的。我已经搜索了关于保持控制流的信息,但是没有真正找到一个例子,如何处理嵌套的MongoDB查询或类似的东西:
Session.find({$or:[{owner:useremail},{users:{$in:[useremail]}}]},function(err,sessions){
if(sessions){
var lastSessionNotes=[];
var numCompletedCalls = 0;
for(var i=0;i<sessions.length;i++){
Notes.find({sessionId:sessions[i].uuid}).sort({creation:-1}).limit(1).exec(function(err,note){
var lastnotedate;
var lastNoteObject={};
if(typeof note[0]!='undefined'){
console.log(note);
lastnotedate=note[0].creation;
lastNoteObject={sessionID:note[0].sessionId,lastNote:lastnotedate};
lastSessionNotes.push(lastNoteObject);
numCompletedCalls=numCompletedCalls+1;
}
});
}
console.log(lastSessionNotes.length);
res.render('home',{username:req.session.user, sessions:sessions, lastSessionNotes:lastSessionNotes});
}
});
非常感谢提前
编辑:
我现在正在使用它,但是现在我遇到了问题,我的Array中有一个Object总是两次,不应该。 Notes.find-Query遍历Notes,按Date排序并返回最新的。
我真的没有得到它,当然如果我返回sessons [i],没有数组返回两次。
此处代码:
Session.find({$or:[{owner:useremail},{users:{$in:[useremail]}}]},function(err,sessions){
if(sessions){
var lastSessionNotes=[];
var numCompletedCalls = 0;
for(var i=0;i<sessions.length;i++){
console.log(sessions[i]);
Notes.find({sessionId:sessions[i].uuid}).sort({creation:-1}).limit(1).exec(function(err,note){
var lastnotedate;
var lastnotesessioniD;
var lastNoteObject={};
if(typeof note[0]=='undefined'){
lastnotedate="Nothing";
//console.log(sessions[numCompletedCalls]);
lastnotesessioniD=sessions[numCompletedCalls].uuid;
}else{
lastnotedate=note[0].creation;
lastnotesessioniD=note[0].sessionId;
}
lastNoteObject={sessionID:lastnotesessioniD,lastNote:lastnotedate};
lastSessionNotes.push(lastNoteObject);
numCompletedCalls=numCompletedCalls+1;
console.log(numCompletedCalls+" "+sessions.length);
if (numCompletedCalls == sessions.length) {
console.log(lastSessionNotes);
res.render('home',{username:req.session.user, sessions:sessions, lastSessionNotes:lastSessionNotes});
}
});
}
}
});
输出:
[ { sessionID: 'Klz8g1', lastNote: 'Nothing' },
{ sessionID: 'Klz8g1', lastNote: 1399485395975 },
{ sessionID: 'Pcfu5Z', lastNote: 1399477346484 },
{ sessionID: 'D241jz', lastNote: 1399485746096 },
{ sessionID: 'EvgXE4', lastNote: 'Nothing' },
{ sessionID: '348oay', lastNote: 1399486524033 },
{ sessionID: 'qkFqPh', lastNote: 'Nothing' },
{ sessionID: 'UeY4c9', lastNote: 'Nothing' } ]
答案 0 :(得分:0)
当你跟踪Notes.find
中已完成的numCompletedCalls
次操作的数量时,你已经很近了,但是你没有做任何事情。您需要在回调中移动res.render
调用,并在numCompletedCalls
显示所有操作都已完成时调用它。
Session.find({$or:[{owner:useremail},{users:{$in:[useremail]}}]},function(err,sessions){
if(sessions){
var lastSessionNotes=[];
var numCompletedCalls = 0;
for(var i=0;i<sessions.length;i++){
Notes.find({sessionId:sessions[i].uuid}).sort({creation:-1}).limit(1).exec(function(err,note){
var lastnotedate;
var lastNoteObject={};
if(typeof note[0]!='undefined'){
console.log(note);
lastnotedate=note[0].creation;
lastNoteObject={sessionID:note[0].sessionId,lastNote:lastnotedate};
lastSessionNotes.push(lastNoteObject);
}
numCompletedCalls=numCompletedCalls+1;
if (numCompletedCalls === sessions.length) {
console.log(lastSessionNotes.length);
res.render('home',{username:req.session.user, sessions:sessions, lastSessionNotes:lastSessionNotes});
}
});
}
}
});