Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步每个系列不按预期返回_Javascript_Node.js_Asynchronous_Mongoose - Fatal编程技术网

Javascript 异步每个系列不按预期返回

Javascript 异步每个系列不按预期返回,javascript,node.js,asynchronous,mongoose,Javascript,Node.js,Asynchronous,Mongoose,我使用异步库,特别是each方法,但是我没有得到预期的结果 function instanceMethod (final_callback) { obj = this; async.parallel([ function (callback) { getTopReplies (obj, function (err, result){ if (err) return c

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

 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);
            });
        }
    });
}
在这种情况下,result应该在数组中返回两个top post id,但它总是返回1,或者如果一个post只有一个top reply,它将返回空

我的密码有问题吗

结果数组是否要在其他地方启动,比如每次调用each函数时是否都要重新初始化


谢谢大家!

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

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

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

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

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

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

在我看来,您并不需要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,您可能也可以摆脱async.eachSeries。它有一个有用的
pulk
方法来基本完成你正在做的事情

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”。这看起来不重要(因为作用域),但对于async,为确保安全起见,将它们命名为不同的名称总是更安全的。

在我看来,您并不需要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,您可能也可以摆脱async.eachSeries。它有一个有用的
pulk
方法来基本完成你正在做的事情

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”。这看起来不重要(因为作用域),但对于async,为确保安全起见,将它们命名为不同的名称总是更安全的。

同步与阻塞不同。array.forEach是阻塞的,而async.eachSeries只是串行迭代(顾名思义)。有效的一点是,我没有考虑数组足够大以致阻塞变得重要的情况。Synchronous不同于阻塞。array.forEach是阻塞的,而async.eachSeries只是串行迭代(顾名思义)。有效点我没有考虑数组足够大以致阻塞变得重要的情况。谢谢你的回答,关于这个问题,我只做了另外两个操作,以说明什么是重要的,这就是我使用async.parallel的原因。我确实把eachSeries改成了each,并对其进行了测试,它是有效的,但是如果我尝试让一堆帖子通过这个过程,有些帖子会有正确的数据,有些则不会,这有点奇怪!与正常工作(或不正常工作)的查询有什么共同之处吗?它们是不同的查询,因此它不应该返回数组,而应该返回一个简单的字符串(id)值,是的,这些工作。将此标记为答案,这给了我很多见解!非常感谢。谢谢你的回答,关于这一点,我只是拿出另外两个操作来说明什么是重要的,这就是为什么我使用async.parallel。我确实把eachSeries改成了each,并对其进行了测试,它是有效的,但是如果我尝试让一堆帖子通过这个过程,有些帖子会有正确的数据,有些则不会,这有点奇怪!与正常工作(或不正常工作)的查询有什么共同之处吗?它们是不同的查询,因此它不应该返回数组,而应该返回一个简单的字符串(id)值,是的,这些工作。将此标记为答案,这给了我很多见解!非常感谢。