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

时间:2014-10-27 13:17:26

标签: javascript node.js mongoose

我有以下代码。但是,最终/结果异步回调发生在乱序中。

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并且阵列出现故障。为什么第一个条目最后处理?有没有更好的方法可以做这个循环?

1 个答案:

答案 0 :(得分:0)

正常for循环不会等待,直到里面的函数准备就绪。您可以更好地更改此for循环以使用异步库。

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

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