async每个系列都没有按预期返回

时间:2013-08-27 22:33:56

标签: javascript node.js asynchronous mongoose

我使用异步库,特别是每个方法,但我没有得到预期的结果。

 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个顶部回复帖子它返回空。

我的代码有什么问题吗?

结果数组是否会在其他地方启动,比如每次重新启动,调用每个函数还是什么?

谢谢!

2 个答案:

答案 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复制到一个新数组中这是一个同步操作