这个问题已经在这里有一个答案:
我需要整理如何使用Node.js和MongoDB回调执行后调用一些功能。我下面提供我的代码。
var updateArr=[];
TempCollection.find({},function(err,docs){
for(var i=0;i<docs.length;i++){
if (docs[i]['login_id']=='' || docs[i]['login_id']==null) {
var zon=docs[i]['zone']+'@oditeksolutions.com';
TempCollection.findOneAndUpdate({$or:[{login_id:null},{login_id:''}]},{$set:{login_id:zon}},{new:true},function(err1,upd){
if(!err1){
updateArr.push(upd);
}
})
}
}
console.log('lrn::',updateArr.length);
if (updateArr.length > 0) {
createAllocation();
createUser();
}
})
在这里,我需要更新后两者功能(i.e-createAllocation and createUser
)所有文件被调用。在此之前更新都被执行的所有文件。
findOneAndUpdate
异步运行,因此当循环结束后,功能将不会做他们的工作呢。
我建议你使用async / await
这样你就可以轻松地运行两个步骤同步(第一个数据库的更新,然后调用在年底的功能):
var updateArr=[];
TempCollection.find({}, async function(err, docs) {
for(var i = 0; i < docs.length; i++) {
if (docs[i]['login_id'] === '' || docs[i]['login_id'] == null) {
var zon = docs[i]['zone'] + '@oditeksolutions.com'
try {
var upd = await TempCollection.findOneAndUpdate({ $or: [{ login_id: null }, { login_id: '' }]}, { $set: { login_id: zon }}, { new: true }).exec()
updateArr.push(upd)
} catch(err1) {
console.log(err1) // throw err1
}
}
}
console.log('lrn::',updateArr.length);
if (updateArr.length > 0) {
createAllocation();
createUser();
}
})