FindOne上的Async.eachSeries不起作用

时间:2016-05-08 05:54:31

标签: javascript node.js mongodb asynchronous mongoose

我对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),那么数组是正确的。

1 个答案:

答案 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”参数将包含您作为错误传递的字符串。

如果没有错误,“错误”将为空,您可以继续执行您想要的任何逻辑。