async function test(){
// [3,2,1].forEach( async (v)=>{
// let res = await fetch(v)
// console.log(res)
// })
// console.log('end')
let arr = [3,2,1]
for(var i=0;i<arr.length;i++){
let res = await fetch(arr[i])
console.log(res)
}
console.log('end')
}
function fetch(x){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('setTimeout',x)
resolve(x)
},5 * x)// setTimeout设置的时间不考虑?
})
}
test()
使用for遍历为什么输出的结果是
3
2
1
end
道理很简单,因为for循环会被await影响,而forEach你传递的闭包所返回的promise并不会被等待。
也就是说,使用闭包看起来是这样执行的
各个异步事件其实是独立的,并不会互相影响
而for循环展开则是这样执行的
一些新人可能会觉得forEach比for更高级,但是forEach其实是无法完成一些操作的,例如中断循环(break),continue循环,循环中不容易异步任务控制(本问题),我的建议是只在一些迭代器代码的尾部使用forEach,常规的业务代码为了控制方便,依然使用for来进行循环。
另外:如果真的需要并发也不应该用forEach,应该使用.map
总的来说使用forEach需要一定的学习,要注意不要滥用,map方法同理,不要将.map方法作为forEach使用。