javascript - 异步每个系列未按预期返回

标签 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 个热门回复,则它返回空。

我的代码有什么问题吗?

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

谢谢!

最佳答案

在我看来,您不需要 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/

相关文章:

javascript - 获取从 angularJS 中的异步 $http 服务获取的对象,以便在 $scope 中全局访问

javascript - Browserify 不起作用 - 为什么?

javascript - Gulp 在 Windows 上运行失败 |错误消息 : Microsoft JScript compilation error, 无效字符

javascript - 为什么这会导致 requireJS 中出现 "Mismatched anonymous define()"?

javascript - 无法让 Passport.js 重定向和闪现消息正常工作

node.js - 在 Node js 应用程序中使用 cluster js 时,socketcluster 是否多余?

exception - Xamarin.Android 在异步方法中没有堆栈跟踪

javascript - 我可以在 AngularJS 中使用 Async.js 库吗?

javascript - toFixed 方法不适用于用户输入,但适用于 javascript 中的其他变量,包括代码片段

javascript - 更改 span 的文本,不影响 child