为什么这个循环发生了故障
Why is this loop happening out of order?
我有以下代码。然而,最终的/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');
})
相关文章:
- 为什么属性存在于对象实例上,即使其原型发生了更改
- Javascript函数 - 通过引用复制,但这里发生了什么
- 如果在线检查期间发生电源故障,我们如何更新用户再次登录门户时的剩余时间
- 套接字发生了什么's在'断开连接'事件(服务器端)
- 这段代码中发生了什么
- Wamp没有识别出我的代码发生了更改
- 如何检查输入框值在使用淘汰之前是否发生了更改
- 通过它访问HTML元素's id DIRECTLY-这里发生了什么
- window.opener引用在Java 1.7.0_04-b20中从Applet重定向期间发生了更改,但在1.7.0_
- 如何知道JS对象属性的值在哪一行发生了更改
- 查找表单的哪些特定部分在输入时发生了更改
- JavaScript's数组过滤器函数在没有分配函数的情况下使用-这里发生了什么
- 起重行为在铬 48 和 49 之间发生了变化
- 这个JavaScript函数中发生了什么
- 我的输入字段听到除回车之外的每个“键下”事件.我有一个日期选择器,不确定发生了什么
- isPrototypeOf 说不,但实例说是——发生了什么
- 找出 Vue.js 深度自定义指令中哪个属性发生了变化
- 十分钟内的 Javascript:此示例代码中发生了什么说明惰性范围
- 键控后 AJAX 发生了一些奇怪的事情
- 为什么这个循环发生了故障