我正在解决一个问题,我需要在db中查询Voter的一个实例,并使用该实例更新Election,返回原始函数,无论该更新是否成功。我的代码目前看起来像这样:
function addCandidatesToElection(req, res) {
let electionName = req.body.electionName;
let candidates = req.body.candidates;
let addedCandidatesSucessfully = true;
for(let i=0; i<candidates.length; i++) {
addedCandidatesSucessfully = _addCandidateToElection(electionName, candidates[i]);
console.log("added candidates sucessfully:" + addedCandidatesSucessfully);
}
if(addedCandidatesSucessfully) {
res.send("createElection success");
} else {
res.send("createElection fail");
}
}
调用此函数:
function _addCandidateToElection(electionName, candidateName) {
async.parallel(
{
voter: function(callback) {
Voter.findOne({ 'name' : candidateName }, function(err,voter) {
callback(err, voter);
});
}
},
function(e, r) {
if(r.voter === null){
return 'Voter not found';
} else {
Election.findOneAndUpdate(
{'name': electionName },
{$push: { candidates: r.voter }},
{new: true},
function(err, election) {
if(err){ return err; }
return (election) ? true : false;
});
}
}
);
}
我已经尝试打印出Voter实例(r.voter)来检查它是否存在(它确实存在),还打印出mongoose调用返回的选举对象,这也有效。但是,我在
中获得了空值addedCandidatesSucessfully = _addCandidateToElection(electionName, candidates[i]);
行,不管调用的结果如何。我认为它与mongoose调用有关,返回一个永远不会返回到调用_addCandidateToElection的函数的本地值,但我不知道应该如何返回它。我尝试过设置控制标志,例如
let foundAndUpdatedElection = false;
在_addCandidateToElection的第一行并在Mongoose查询的回调中更新它,但显然它没有改变。 我该如何将查询结果返回给addCandidatesToElection函数?
答案 0 :(得分:0)
你可能应该“宣传”你的代码,以帮助你更好地处理js的异步性质。尝试以下代替您的示例:
df.schema()
您也不再需要使用异步库,因为承诺现在在ES6中是原生的