前言
很好奇为啥 forEach 不能结束循环 && 不支持 async/await同步执行,今天去找了找原因
问题
1 | function test() { |
期望值:3、2、1,实际上: 1、2、3,相当于并行执行了
原理
为什么呢?以下是 forEach 的源码
1 | // Production steps of ECMA-262, Edition 5, 15.4.4.18 |
主要看这里
1 | /* |
可以看到 callback
是我们传入的一个被 async 封装的 promise 对象,而 Array.prototype.forEach 内部并没有对这个 promise 对象做任何处理;而且在 callback
使用 break 也不能结束循环。
尝试改造一下,让它支持 async, awiat:
1 | Array.prototype.forEach = async function(callback /*, thisArg*/) { |
所以面对 async await 的需求或者跳出循环,使用 for…of、for…in 或者 for 循环
for…of
为啥 for…of 可以呢?机制不同,forEach 是直接调用回调函数,for…of 是通过迭代器的方式去遍历
1 | async function test() { |