es6新语法特性forEach,与传统的for循环不同的是,forEach会自带一个异步操作,导致循环内外不操作执行不会同步的问题。如以下的情况:
代码中:在forEach循环外部等待循环执行完成,并且要获取到循环内部处理过的数据,但是在循环外部拿到的却是原始的数据
var arrayA = [];
var arrayB = [1,2,3,4,5];
arrayB.forEach((item,index)=>{
arrayA.push(item)
})
console.log(arrayA) // 结果为[]
预期结果是:arrayA = [1,2,3,4,5],而实际拿到的结果却是arrayA = [],原因就是由于forEach的异步操作,导致代码先执行完成的是后面的console.log(arrayA)语句。但有一个细节:在forEach循环的内部是可以获取到处理后的数据的,所以这里要改变以下思路,即将循环外部的同步代码搬到循环内部,在最后一次循环执行完毕后再执行外部的同步代码。
var arrayA = [];
var arrayB = [1,2,3,4,5];
arrayB.forEach((item,index)=>{
arrayA.push(item);
// 内部执行同步代码,规避异步问题
if(index == arrayB.length-1){
console.log(arrayA); // [1,2,3,4,5]
}
})
//console.log(arrayA); // 结果为[]
以上操作的思路就是在循环内部等待异步操作执行完成,再进行数据获取的操作,便可完美地解决forEach异步地问题了!