循环数组并在循环中检查MongoDB集合(异步)

时间:2014-10-03 10:02:44

标签: javascript node.js mongodb asynchronous

我在调用mongodb时遇到一些异步循环问题。我尝试了几种方法,并研究了诸如async和co-monk之类的库。 (我使用和尚作为我的连接等)。

我有一个数据数组,我需要传递给mongo集合来检查它的确定等等。我的背景是PHP / Sql,所以mongo的异步性质有点难以理解。< / p>

我尝试做的一些基本的sudo代码:

function check (collection) {
    var records = { { body: "Test 1"}, { body: "Test 2" } };
    for (var i in records) {
        collection.find({ body: records[i].body }, {}, function (e, rows) {
            console.log(rows);
        });
    }
}

它只在记录的最后一个循环上执行。我知道这是由于JS的异步性质,但我如何正确地构造它才能像这样工作?

谢谢,

1 个答案:

答案 0 :(得分:5)

异步处理的一般关键是你想要在进行下一次迭代之前有一些关于当前迭代何时完成的指示。由于.find()这样的实际操作在这里自己采用了一个&#34;回调&#34;这是&#34;被称为&#34;当操作通过响应完成时,您通常要做的就是在相同的代码段中调用表示迭代结束的内容。

从基本的角度来说,您可以使用"async.eachSeries"方法在传统循环中获得类似的结果,这样只会让#34;一次迭代#34;发生:

function check (collection) {
    var records = [ { body: "Test 1"}, { body: "Test 2" } ];
    async.eachSeries(records,function(item,callback) {
        collection.find( item, function (err, rows) {
            console.log(rows);
            callback(err)
        });
    },function(err) {
        if (err) throw err;
        console.log("done");
    });
}

所以每个数组参数都传递给&#34;迭代器&#34;在这里作为&#34;项目&#34;参数,第二个参数是&#34;回调&#34;以后要使用的功能。每次调用迭代器时,该参数都会传递给.find()方法,而[]方法又有一个&#34;回调&#34;它自己的错误&#34;错误&#34;或&#34;文件&#34;给出了答复。

在回调中,&#34;回调&#34;由#34; iterator提供&#34;然后调用函数来表示当前迭代的完成。这允许&#34;每个&#34;在这里继续工作并确实称之为下一个&#34;迭代&#34;并处理下一个数组元素。

注意你的背景,要注意标记一个&#34;阵列的正确方法。在JavaScript中使用{{1}}括号,如图所示。这在使用数组时通常是一个重要的区别。

"async.each""async.eachLimit"还有其他变体,它们都允许某种程度的并行处理,但是&#34;系列&#34;方法做的事情&#34;按顺序&#34;以一种习惯于传统循环的方式。

所以在循环操作是&#34;非阻塞&#34;的情况下,你需要在你想要继续之前表示该循环何时完成。