我有以下代码。但是,最终/结果异步回调发生在乱序中。
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并且阵列出现故障。为什么第一个条目最后处理?有没有更好的方法可以做这个循环?
答案 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');
})