为什么这个循环发生了故障

Why is this loop happening out of order?

本文关键字:发生了 故障 循环 为什么      更新时间:2023-09-26

我有以下代码。然而,最终的/result异步回调发生了故障。

function dogetcomp(sid, acb) {
    var comp = [];
    completed.find({
        sid: sid
    }).sort({
        date: -1
    }).limit(25).exec(function(err, comps) {
        for (var i = 0; i < comps.length; i++) {
            (function(cnt) {
                var d = {};
                async.series([function(cb) {
                    user.findOne({
                        uid: comps[cnt].uid
                    }, function(err, u) {
                        d.uname = u.name;
                        d.when = comps[cnt].date.toString();
                        cb();
                    });
                }, function(cb) {
                    rec.findOne({
                        type: comps[cnt].type
                    }, function(err, q) {
                        d.qname = q.name;
                        cb()
                    });
                }], function(res) {
                    console.log(cnt);
                    comp.push(d);
                    if (comp.length == comps.length) {
                        acb(null, comp);
                    }
                });
            })(i);
        }
    });
}

这会导致打印1、2、3、0,并且阵列出现故障。为什么第一个条目是最后处理的?有没有更好的方法可以让我做这个循环?

正常的for循环不会等到里面的函数准备好。您可以更好地将for循环更改为也使用异步库。

使用async.eachSeries,然后在async.series的回调中,调用async.echSeries的回调,然后它将以良好的顺序执行。

async.eachSeries([0,1,2,3],function(number,call){
  async.series([],function(res){call()});
},function(err){
    console.log('done');
})