1

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

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

我的代码有什么问题吗?

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

谢谢!

4

2 回答 2

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);
        }
    });
});

我并不是说这会解决你的问题。但是消除不必要的异步/回调复杂性使其更容易调试。

就此而言,如果您使用下划线,您可能也可以摆脱 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
    });
}

排除了所有不必要的异步之后,应该更容易找出问题所在。可能是因为您将两个回调都命名为“回调”。看起来它应该无关紧要(因为范围界定),但是对于异步,为了确定起见,将它们命名为不同的东西总是更安全。

于 2013-08-28T03:32:35.150 回答
0

不确定您的确切问题,但为什么要使用 async.eachSeries 而不是

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

如果我理解正确,您只需将 id 复制到一个新数组中,这是一个同步操作

于 2013-08-28T01:23:57.580 回答