2015-04-07 21 views
0

我有2个嵌套的async.each。他们看起来像:节点js应用程序中的async.js问题

async.each(result, function(row, callbackrow) { 
    tot = 0; 
    console.log('UID:', row.uid); 

    async.each(row.vbs, function(vb, callback){ 
    checkInteractions(row.uid, vb.vbNID, function(data){ 
     console.log(data); 
     callback(); 
    }); 
    }, function(err){ console.log('done 1'); }); 

    callbackrow(); 
}, function(err){ console.log("done all"); }); 

我的问题是,checkinteraction异步调用导致问题。没有它,控制台日志从第二个每个第一个异步调用每个。有了它,我完成了所有的消息,并且在嵌套的(第二个)异步每个执行它的代码之后。我需要它像一个for的同步呼叫。对于第一个for的每个元素,第二个要在执行第一个for之前的下一个索引之前执行。

回答

1

我觉得应该callbackrow作为内环的最终回调传递,从而使外环知道何时执行到下一个迭代,就像这样:

async.each(result, function(row, callbackrow) { 
    tot = 0; 
    console.log('UID:', row.uid); 

    async.each(row.vbs, function(vb, callback){ 
    checkInteractions(row.uid, vb.vbNID, function(data){ 
     console.log(data); 
     callback(); 
    }); 
    }, function(err){ 
    console.log('done 1'); 
    callbackrow(); 
    }); 

}, function(err){ console.log("done all"); }); 
+0

tryed这一点。我按顺序获得最终的回调控制台日志。来自async的数据日志在外循环调用其最终日志回调后仍然执行。 – user3761400