Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于循环函数闭包打印的Javascript无序_Javascript_Closures - Fatal编程技术网

用于循环函数闭包打印的Javascript无序

用于循环函数闭包打印的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

在围绕异步/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
问题是,当我输入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 Promise
cntr
?在我看来
未定义
。哦,您还应该将自执行函数末尾的
(i)
更改为
(i))
,因为现在有些浏览器不接受另一种方式。这是执行函数闭包的正确方法,PHPglue