我在Async.waterfall结束时得到一个空数组,不知道为什么,但这是我的代码的样子:
exports.GetJobs = function(req,res){
var Jobs =[]; ///// Jobs is a global variable
async.waterfall([
function(next){
// get my alert
UserAlertDB.find({User:req.user.id},function(err,AlertResult){
next(null,AlertResult);
})
},
function(AlertResult, next) {
// You might get an error if you do not have created an alert so AlertResult[0].Words will not exist
if(AlertResult) // if Alert Result not equal to null then query by alert
{
JobDB.find({title: new RegExp(AlertResult[0].Words, 'i')}, function (err, JobResults) {
if (err) console.log(err);
// If the job matches the requirements for alert then push it to the list
JobResults.forEach(function(job){
JobOffer.find({JobID : job._id, JobOfferOwnerID: req.user.id}, function(err,Offers){
if(err) console.log("Error Inside Querying Jobs Result for Alert " + err);
if(Offers.length==0){
console.log("Jobs are : " + JSON.stringify(Jobs)) // when I print the Jobs array here it shows that a job is getting pushed into the array
Jobs.push(job);
}
})
})
next(err,Jobs) // But Jobs here is empty
})
}
else{
next("There is an error",null)
}
}
], function(err,Jobs){
console.log(JSON.stringify(Jobs)); ////// Getting Empty Jobs here
if(err) console.log("Error Inside Get Jobs Match Alert Data in Server : " + err);
res.json(Jobs); ////// Jobs here is empty
});
}
所以如果你注意到当我尝试最后发送Jobs数组时res.json(Jobs)有空的Jobs,虽然我已经在Jobs数组中推送了那些作业。
答案 0 :(得分:1)
代码中的问题是JobResults.forEach是同步的,并且您正在forEach循环中调用异步JobOffer.find。因此,您的程序不会等待异步操作完成并立即调用下一个(错误,作业)。而不是forEach仅在async.each完成时使用async.each并调用next(错误,作业)。我还建议你确保检查每个回调中的错误值,例如,即使可能存在错误,你也会传递null:
// get my alert
UserAlertDB.find({User:req.user.id},function(err, AlertResult) {
next(err, AlertResult);
})
希望它有所帮助,如果您需要其他任何有关代码的帮助,请与我们联系。