node.js async.eachSeries太早调用最终callback

这就是我想要的:我有一个称为结果的大数组。 该数组中的每个项目我想放在我的迭代函数,并将其保存到我的mongoDB(我省略了一些步骤,以及哪些不重要)。 这些项目中的每一个都被保存到数据库(或拒绝)后,我想console.log显示“全部完成”。 不幸的是,所有的完成都在调用系列后几乎立即显示,而其他所有内容仍在处理。 我该如何解决这个问题?

我正在使用称为“光”的模型mongoose,为了可读性,我省略了代码中的所有错误消息。 我为eachSeries部分使用node-async

var async = require('async'); var results = [very big array] var iteration = function(row,callbackDone) { light.find({data: row.data}, function (err,entry) { if(entry.length) { callbackDone(); return console.log(entry + ' already exists'); } var newEntry = new light(row); newEntry.save(function (err,doc) { console.log(entry + ' saved'); callbackDone(); }); }); }; async.eachSeries(results,iteration, function (err) { console.log('All done'); }); 

(答案,而不是评论,因为文本太长…)

我正在使用asynchronous的东西,你的问题困惑了我。 我尝试了下面的代码,结果更进一步。 它为我工作得很好。 (asynchronous0.2.9)。 即使将我的超时延迟更改为0。

唯一看起来很奇怪的是if(entry.length)块在callback后打印了控制台信息。 如果你得到了很多“已经存在”的消息,我可能会看到他们以后可能会来 – 但这听起来不像你所描述的。

 var async = require('async'); var console = require('console'); var results = [ ]; results.push( {id:1,data:'a'} ); results.push( {id:2,data:'b'} ); results.push( {id:3,data:'c'} ); results.push( {id:4,data:'d'} ); function doFind( obj, callback ) { setTimeout( function() { console.log( "finding id=" + obj.data.id ); obj.data.length = obj.data.id % 2; callback( null, obj.data ); }, 500 ); } function light( obj ) { this.id = obj.id; this.data = obj.data; this.save = function( callback ) { setTimeout( function() { console.log( "saving id=" + obj.id ); callback( null, this ); }, 500 ); }; } var iteration = function(row,callbackDone) { doFind({data: row}, function (err,entry) { if(entry.length) { callbackDone(); return console.log( 'id=' + entry.id + ' already exists'); } var newEntry = new light(row); newEntry.save(function (err,doc) { console.log( 'id=' + entry.id + ' saved'); callbackDone(); }); }); }; async.eachSeries(results, iteration, function (err) { console.log('All done'); }); 

结果

 finding id=1 id=1 already exists finding id=2 saving id=2 id=2 saved finding id=3 id=3 already exists finding id=4 saving id=4 id=4 saved All done