使用forEach循环异步函数时,会先整个循环一遍,然后再输出异步函数的结果,这样就没法在循环结束后拿到异步函数的结果,正确的写法应该是用递归方法,等待异步函数执行完毕后才进入下一次循环。下面是两种写法的执行结果。

用forEach循环
用递归方法循环

 

实例(复制到控制台看效果):

let arr = [5,4,1,3,2];
// forEach循环
arr.forEach((item,index)=>{
    // 用setTimeout模拟异步函数
    setTimeout(()=>{
        console.info(item);
        if(index>=arr.length-1) {
            console.info('循环结束');
        }
    },item*100);
});

//递归循环
(function loop(i){
    setTimeout(()=>{
        console.warn(arr[i]);
        if(++i>=arr.length) {
            console.warn('循环结束');
        } else {
            loop(i);
        }
    },arr[i]*100);
})(0);