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

Lia*_*man 3 javascript asynchronous mongodb node.js

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

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

我正在尝试做的一些基本的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);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

Nei*_*unn 5

异步处理的一般关键是,您希望在继续下一次迭代之前获得有关何时完成当前迭代的一些指示.由于.find()这里的实际操作本身采用了一个"回调",当操作通过响应完成时被"调用",那么你通常要做的就是在相同的代码段中调用表示迭代结束的东西.

在基本方面,您可以使用"async.eachSeries"方法在传统循环中获得类似的结果,该方法只允许"一次一次迭代":

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");
    });
}
Run Code Online (Sandbox Code Playgroud)

因此,每个数组参数都作为"item"参数传递给"iterator"函数,第二个参数是稍后要使用的"回调"函数.每次调用迭代器时,该参数都会传递给.find()方法,而该方法又具有自己的"回调",其中给出了"错误"或"文档"响应.

在该回调中,然后调用"迭代器"函数提供的"回调"以表示当前迭代的完成.这允许这里的"each"函数继续并确实调用下一个"迭代"并处理下一个数组元素.

注意你的背景,请注意用JavaScript标记"数组"的正确方法,[]如图所示.在使用数组时,这通常是一个重要的区别.

还有"async.each""async.eachLimit"的其他变体,它们都允许某种程度的并行处理,但"Series"方法以一种您习惯于传统循环的方式"按顺序"执行.

因此,循环操作是"非阻塞"的,您需要在您想继续之前表示该循环何时完成.