我对FindOne的异步有问题。我有一个名为idChildren的id数组(如[[516152],[158796],[123654,147852]]),我想检查数组上当前位置的id是否在数据库中。 children是一个数组,我用所有信息保存字符串。
for (var j = 0; j < idChildren.length; j++)
{
async.eachSeries(idChildren, function() {
for (var i = 0; i < idChildren[j].length; i++)
{
Children.findOne({ _id: idChildren[j] }, function (err, child) {
console.log("I'm in the findOne");
if (child != undefined && !err) {
if (child.lastname == undefined)
tmp2 += ',';
else
tmp2 += child.lastname + ',';
if (child.firstname == undefined)
tmp2 += ',';
else
tmp2 += child.firstname + ',';
if (child.birthday == undefined)
tmp2 += ',';
else
tmp2 += child.birthday + ',';
tmp2 += '\n';
}
children.push(tmp2);
tmp2 = "";
});
}
});
}
console.log(children);
问题是&#34; console.log(儿童)&#34;打印[,,],然后在&#34;我在findOne&#34;三次。我认为我的async.eachSeries不正确。 你能救我吗?
修改
async.eachSeries(idChildren, function(idChild, next) {
Children.findOne({ _id: idChild }, function (err, child) {
console.log("I'm in the findOne");
if (child != undefined && !err) {
if (child.lastname == undefined)
tmp2 += ',';
else
tmp2 += child.lastname + ',';
if (child.firstname == undefined)
tmp2 += ',';
else
tmp2 += child.firstname + ',';
if (child.birthday == undefined)
tmp2 += ',';
else
tmp2 += child.birthday + ',';
tmp2 += '\n';
}
children.push(tmp2);
tmp2 = "";
next();
return;
});
});
console.log(children);
输出结果为:
[]
我在findOne中 我在findOne中 我在findOne中 我在findOne中 我在findOne中
因此,首先执行console.log(children),并在FindOne循环工作之后执行。 如果你在findOne的末尾有console.log(children),那么数组是正确的。
答案 0 :(得分:0)
因此,如果我理解正确,代码可以正常工作,问题只出在console.log()和你想在循环结束时执行的任何其他逻辑的时候。
如果是这种情况,请使用以下代码:
async.eachSeries(idChildren, function(idChild, next) {
Children.findOne({ _id: idChild }, function (err, child) {
console.log("I'm in the findOne");
if (child != undefined && !err) {
if (child.lastname == undefined)
tmp2 += ',';
else
tmp2 += child.lastname + ',';
if (child.firstname == undefined)
tmp2 += ',';
else
tmp2 += child.firstname + ',';
if (child.birthday == undefined)
tmp2 += ',';
else
tmp2 += child.birthday + ',';
tmp2 += '\n';
}
children.push(tmp2);
tmp2 = "";
next();
return;
});
},
// finally method
function(err) {
if (err) {
//do some error handling
}
console.log(children);
// do some other logics
});
正如您所看到的,async.eachSeries方法接受另一个函数参数,该参数代表“finally方法” - 在循环完成后将调用的方法。
如果其中一个循环迭代将使用一个代表错误的参数调用next,例如:
return next("Cannot find child object");
在这种情况下 - 循环将停止运行,finally方法中的“err”参数将包含您作为错误传递的字符串。
如果没有错误,“错误”将为空,您可以继续执行您想要的任何逻辑。