Array.prototype.forEach = function(cb) { // this指代调用forEach的array for (let index = 0; i < this.length; i++) { // 回调函数的三个参数:index,item,array cb(index, this[index], this); } }
从上面的代码可以得知,forEach只是简单地执行了回调函数而已,而不会去处理异步的情况
test函数可以修改为等价的代码,如下所示:
1 2 3 4 5 6 7 8 9
asyncfunctiontest() { let nums = awaitgetNumber(); // nums为 [1,2,3] for (let i = 0; i < nums.length; i++) { (async item => { let res = awaitmulti(item); console.log(res); })(nums[i]); }
从以上代码可以得知:forEach中异步函数是并行执行,导致了一次性全部输出结果:1,4,9
解决办法
方式一:for循环
通过改造forEach,确保每一个异步的回调执行之后再去执行下一个
1 2 3 4 5 6 7 8 9 10 11 12 13 14
asyncfunctionasyncForEach(array, cb) { for (let i = 0; i < array.length; i++) { awaitcb(array[i], i, array); } }
asyncfunctiontest() { let nums = awaitgetNumber(); // nums为 [1,2,3] asyncForEach(nums, async item => { let res = awaitmulti(item); console.log(res); }) }