我使用异步库,特别是每个方法,但我没有得到预期的结果。
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);
});
}
});
}
这是一个结果应该在数组中返回两个顶部帖子id但是它总是返回1的情况,或者如果只有1个顶部回复帖子它返回空。
我的代码有什么问题吗?
结果数组是否会在其他地方启动,比如每次重新启动,调用每个函数还是什么?
谢谢!
答案 0 :(得分: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);
}
});
});
我不是说这会解决你的问题。但是删除不必要的异步/回调复杂性使得调试变得更加容易。
就此而言,如果你使用underscore,你也可以摆脱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
});
}
将所有不必要的异步放在一边,弄清楚出了什么问题要容易得多。可能是因为你将两个回调命名为“回调”。看起来它应该不重要(因为范围),但是对于异步,为了确定它们,将它们命名为不同的东西总是更安全。
答案 1 :(得分:0)
不确定您的确切问题,但为什么使用async.eachSeries而不是
var result = [];
if (tops){
tops.forEach(function(top){
result.push(top._id);
});
};
return callback(null,result);
如果我理解你只是将id复制到一个新数组中这是一个同步操作