我正在使用异步库,特别是每个方法,但我没有得到预期的结果。
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 个热门回复,则它返回空。
我的代码有什么问题吗?
结果数组是否要在其他地方启动,例如每次调用每个函数时都会重新启动它或其他什么?
谢谢!
最佳答案
在我看来,您不需要 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
});
}
排除所有不必要的异步之后,应该更容易找出问题所在。可能是因为您将这两个回调都命名为“callback”。看起来它应该不重要(因为作用域),但是对于异步,为了确定起见,将它们命名为不同的东西总是更安全。
关于javascript - 异步每个系列未按预期返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18476578/