asynchronous每个系列不会按预期返回

即时通讯使用asynchronous库,特别是每个方法,但我没有得到预期的结果。

function instanceMethod (final_callback) { obj = this; async.parallel([ function (callback) { getTopReplies (obj, function (err, result){ if (err) return callback(err); if (result) { obj.topReplies = result; callback(); } }); } // ... theres actually more 2 functions here but // I removed them for the sake of space and // readability, ], function (err){ if (err) return final_callback(err, false); return final_callback (false, true); }); 

这是从一个async.parallel函数列表中调用的函数

 function getTopReplies (obj, callback) { mongoose.model('Post').find({replyTo: obj._id, draft: false}) .limit(3).sort('-createdAt') .exec(function(err, tops) { if (err) return callback(err); var result = []; if (tops) { async.eachSeries(tops, function(top, callback) { result.push(top._id); callback(); }, function (err){ if (err) return callback(err); return callback(null, result); }); } }); } 

在这种情况下,结果应该返回两个顶部postID在数组中,但它总是返回1或如果只有一个顶部回复一个职位,它返回空。

我的代码有什么问题吗?

结果数组是否在其他地方发起,就像是每次重新启动,每个函数被调用或什么?

谢谢!

它看起来不像我需要的async.parallel调用。 当你传递多个函数时,使用它确实是有意义的。 你基本上是说“同时做这个任务”。 尝试这个:

 function instanceMethod (final_callback) { obj = this; getTopReplies (obj, function (err, result){ if (err) return final_callback(err, false); if (result) { obj.topReplies = result; return final_callback (false, true); } }); }); 

我不是说这会解决你的问题。 但是消除不必要的asynchronous/callback复杂性使得debugging变得更容易。

对于这个问题,如果你使用下划线 ,你也可以摆脱async.eachSeries。 它有一个有用的pluck方法基本上做你在做什么。

 function getTopReplies (obj, callback) { mongoose.model('Post').find({replyTo: obj._id, draft: false}) .limit(3).sort('-createdAt') .exec(function(err, tops){ if (err) return callback(err); if (tops) return callback(null, _.pluck(tops, _id)); // Assuming you declare _ earlier in the module }); } 

所有这些不必要的asynchronous消除,应该是很容易弄清楚是怎么回事。 可能是因为你把两个callback命名为“callback”。 它看起来应该不重要(因为范围),但是与asynchronous相比,为了确保命名不同的东西总是比较安全的。

不知道你确切的问题,但为什么你是用async.eachSeries而不是

 var result = []; if (tops){ tops.forEach(function(top){ result.push(top._id); }); }; return callback(null,result); 

如果我理解它正确的只是复制ids到一个新的数组这是一个同步操作