nodejs异步两个数组和mongoose查找

时间:2015-01-25 10:49:13

标签: node.js asynchronous mongoose each

我试图在我的nodejs应用程序上使用async模块并不幸运。

假设我有以下内容:

/**
* parents=['parent1Template','parent2TEmplate',...]
* children=[[{id: 'child1Parent1'}{id: 'child2Parent1'}],[{id: 'child1Parent2"}{id: 'child2Parent2'}],...]
* 
*/
function createTemplate(parents,children){
     var final=[]
     async.each(Object.keys(parents), function(item,done){
                 if(children[item].length!==0) addChildsByParent(parents[item],children[item], function (result) {
                     final.push(result);
                 });
                 done();
     });
         console.log("Final results: "+final);
 return final;
}


function addChildsByParent (parent,childs,callback){
     var template=[];
      //some operations..        

    async.each(childs,function(child){
        Children.findone({"_id": child.id}, function (err,ch)){
              template.push(ch);
        }
    });
    return callback(template)
}

我需要在所有操作完成后获得最终的所有结果。 我在异步模块上也看到了并行和瀑布的功能,但主要的问题是我需要总是使用两个数组并在获得单个值时进行查询。

最好的方法是什么,也许是这样的?

 async.waterfall([ 
   each()...
   async.waterfall([  
      each()...   
   ]) 
 ])

1 个答案:

答案 0 :(得分:1)

我会使用异步映射而不是每个使用映射回调来构建响应数组。 此外,我会使用异步并行而不是瀑布来提高速度,因为操作不依赖于彼此并且可以并行执行。

async.parallel({
    final : function(next) {
        async.map(Object.keys(parents), function(item,done){
            if(children[item].length!==0) addChildsByParent(parents[item],children[item], function (result) {
                done(null, result);
            });
        }, next);
    },
    template : function(next) {
        async.map(childs, function(child, done) {
            Children.findone({"_id" : child.id}, function (err, ch) {
                done(err, ch);
            });
        });
    }
}, function(error, results){
    if (!error) {
        console.log(results);
        // This will be {final:[], template:[]}
    }
});