异步并行并使用bind进行迭代

时间:2015-08-11 14:28:34

标签: node.js asynchronous mongoose

一直在努力,所以我想如果有人有快速回答的话。一直试图让异步工作做并行调用,并设法做到这一点(感谢其他人:))。

但是,我现在遇到的问题是我需要将一个变量发送到回调函数中。基本上,我试图使用mongoose向数据库发出五个请求,以在表中找到0-5级。

设置一个从0到4迭代的for循环,每个循环生成一个queries.push。完成该循环后,它会调用async.parallel等待回复。所有这些都有效,除了读取i,其中包含0-4之间的数字。起初我以为我可以通过在闭包中添加(i)来发送它。但是这会调用async.parallel(认为它找到它并将其识别为不是函数)。 认为bind是答案,但不确定我应该绑定到什么。

console.log("Lets see if we can't figure out this one once and for all");
var queries= [];
var maxLevels = 1;
for ( var i = 0; i < maxLevels; i++ ){
    console.log("Looking for "+ i)
    queries.push(function (cb) {
        console.log("Seaching for "+ i)
        Skill.find({level: i}).exec(function (err, docs) {
            if (err) {
                throw cb(err);
            }

            // do some stuff with docs & pass or directly pass it
            cb(null, docs);
        });
    });
}
console.log("In theory we now have 5 requests");
async.parallel(queries, function(err, docs) {
    // if any query fails
    if (err) {
        throw err;
    }
    console.log("This is what we got back")
    for (var doc in docs){
        console.log("Lets find 0")
        cuDoc = docs
        if (cuDoc === undefined ){
            console.log("Got nothing on "+ cuDoc);
        } else {
            console.log("Looking at " + cuDoc);
        }

    }

})

1 个答案:

答案 0 :(得分:1)

为什么不使用find({level: { $gte: 0, $lte: 5 }})之类的内容?如果您希望查询仅匹配整数,则可以使用{$in: [0,1,2,3,4,5]}

无论如何,我会使用async.each,这似乎更适合使用索引,如下所示:

var array = ['level 0', 'level 1', 'level 2', 'level 3', 'level 4'];
async.each(array, function(element, callback){
    console.log("element : "+ element);
    console.log("array.indexOf(element) : "+array.indexOf(element));
    /* query here */
    callback();
},function(){
    /* stuff there */
    console.log("done");
})

这是控制台:

debugger listening on port 47025
element : level 0
array.indexOf(element) : 0
element : level 1
array.indexOf(element) : 1
element : level 2
array.indexOf(element) : 2
element : level 3
array.indexOf(element) : 3
element : level 4
array.indexOf(element) : 4
done