用于循环函数闭包打印的Javascript无序
在围绕异步/ajax调用包装for循环时,我正在实现IIFE方法用于循环函数闭包打印的Javascript无序,javascript,closures,Javascript,Closures,在围绕异步/ajax调用包装for循环时,我正在实现IIFE方法 var j = 4; for (var i = 0; i < j; i++) { (function(cntr) { asyncCall(function() { console.log(cntr); }); })(i); } var j=4; 对于(变量i=0;i
var j = 4;
for (var i = 0; i < j; i++) {
(function(cntr) {
asyncCall(function() {
console.log(cntr);
});
})(i);
}
var j=4;
对于(变量i=0;i
问题是,当我输入console.log cntr时,我得到了所有的值,但它们的顺序是随机的。假设我有一个来自0-4
的for循环。它将以随机顺序打印这些值,如2,1,3,4,0
。每次我重新运行代码时都会发生变化
编辑:
与此相关的问题肯定不是答案。在标记为副本之前,请多加注意。我甚至没有使用nodejs…您的
异步调用
不会在固定的时间内完成。由于您在同步for循环中开始每个异步调用,因此无论哪个调用首先完成,都将首先记录(换句话说,调用不会等待彼此)
有两种方法可以解决这个问题。第一种方法是等待每个asyncCall
完成,然后再开始下一个调用,这可以通过递归轻松实现:
var调用=4
变量i=0
异步调用(函数处理程序(){
控制台日志(i)
if(++i<调用)异步调用(处理程序)
})
函数异步调用(处理程序){
setTimeout(处理程序,0)
}
一个自动执行的闭合器,看起来像是您正在寻找的,使用方式如下:
/
/*external.css*/
html,正文{
填充:0;边距:0;
}
梅因先生{
宽度:980px;边距:0自动;
}
.产出{
宽度:100px;边框:1px实心#000;边框顶部:0;
}
.输出:第一个孩子{
边框顶部:1px实心#000;
}
蓝先生{
背景:浅蓝色;
}
很抱歉
这
例子
国际标准化组织';T
更好
asyncCall做什么?我使用的是facebook api,但不一定与问题相关。它可能是任何异步调用。如果asyncCall
具有随机延迟,您应该得到与您的情况类似的随机数。为了让它工作,我会使用Chain Promisecntr
?在我看来未定义
。哦,您还应该将自执行函数末尾的(i)
更改为(i))
,因为现在有些浏览器不接受另一种方式。这是执行函数闭包的正确方法,PHPglue