for+异步调用
程序员文章站
2022-03-16 19:13:58
...
//第一种出现问题
var arrs = [{ x: '1' }, { x: '2' }, { x: '3' }]
for(var i=0;i<arrs.length;i++){
console.log(i) //0 1 2
setTimeout(function(){
console.log(i) //3 3 3
},0)
}
//第二种封装起来可以输出循环的数据了,可是如果返回时间不同,顺序就会变成按时间排列
for (var i = 0; i < arrs.length; i++) {
fx(i)
}
function fx(a) {
setTimeout(function () {
console.log(a) //0 1 2
}, Math.random() * 1000) //如果异步的时间相同,那么输出的顺序相同 如果异步的时间不同,那么顺序就是乱的,解决的方式用递归代替for循环
}
//第三种递归代替for循环,增加一个停止变量
function fx(a,length){
setTimeout(function(){
if(++a<length){
fx(a,length)
console.log(a)
}
},Math.random()*1000)
}
fx(-1,3)
第二个for循环 多调用了一个函数, 看上去是把一个异步模块封装起来 , 实际上是一个闭包 (内部函数能使用外部函数的变量)
上一篇: for 练习