js中forEach回调同异步问题

10次阅读

共计 602 个字符,预计需要花费 2 分钟才能阅读完成。

js 中 forEach 本身是同步的举个栗子:
[many, too many, so many].forEach((value) => {
some code; // 这是一个大数值运算(非异步代码),需要几毫秒的时间
});
other code; // 这些代码将会阻塞,等到 forEach 循环完之后执行
这是回调中没有异步代码的情况。
再举一个有异步的
[1, 2, 3].forEach((value) => {
setTimeout(function() {
some code;
}, 1000);
});
other code; // 这部分代码不会被 setTimeout 阻塞,forEach 遍历完 1,2,3 之后就执行

[1, 2, 3].forEach(async (value) => {
let foo = await promiseFn();
});
other code; // 同样不会受到异步阻塞
上面是 2 种异步代码形式,但是都不会阻塞后面的代码。我理解的是:forEach 的回调函数会被立即执行,回调里有异步代码,根据 EventLoop 机制放入调用栈,继续执行同步代码以结束; 回调本身就是异步函数,放入调用栈,结束本次遍历。
结合代码理解:
Array.prototype.forEach = function (callback) {
for(let index = 0; index < this.length; index++) {
callback(this[index], index, this);
}
}

正文完
 0