嵌套的asynchronous循环推送到不调用主callback的asynchronous队列

我有一个asynchronous队列,我正在推动哪些会做些什么。 我生成需要插入的项目的方法是通过几个嵌套列表形成一个数据对象。 队列结束了处理所有事情,但由于某种原因,我无法通过console.log('All done.')主要的callback。 我已经删除了大部分不必要的东西,只剩下asynchronous的东西。 我究竟做错了什么? 我错过了什么吗?

 var q = async.queue(function(task, callback) { console.log('hello ' + task); callback(); }, 2); function A(data) { B(data, function() { // THIS ISN'T getting called. console.log('All done.'); }) } function B(data, callback1) { var list = [[1,2], [3,4], [5,6]]; async.each(list, function(item, callback1) { async.each(item, function(i, callback2) { doWork(i, function() { console.log('Work done'); }) callback2(); }, // THIS should be called when everything in this each is done. callback1) }) } function doWork(i, callback3) { q.push(i, callback3); } 

这里的代码有一些评论,因为谈论callback的callback有点复杂:

 function B(data, callback1 //this is what you want to be called) { var list = [[1,2], [3,4], [5,6]]; //async1 async.each(list, function(item, callback1 //now callback1 is a function passed to your code by `async.each` not the original callback1) { //async2 async.each(item, function(i, callback2) { doWork(i, function() { console.log('Work done'); }) callback2(); }, // THIS is actually called, it's just a different function than you think it is callback1) }) } 

问题在于,对B的参数和async1callback函数的callback参数使用了相同的名称。

因此,async1callback中的callback1隐藏了外部callback1 ,实际上是内部的async1callback,用于将控制权交还给async.each

解决方法很简单:重命名async1callback参数,例如:

 function B(data, callback1) { var list = [[1,2], [3,4], [5,6]]; async.each(list, function(item, async1_callback) { //here lies the rename async.each(item, function(i, callback2) { doWork(i, function() { console.log('Work done'); }) callback2(); }, // this is now called as expected callback1 ); // BUT we forgot to call the async1_callback, so let's do it: async1_callback(); }; 

按预期工作。