js中forEach自己是同步的
舉個栗子:promise
[many, too many, so many].forEach((value) => { some code; // 這是一個大數值運算(非異步代碼),須要幾毫秒的時間 }); other code; // 這些代碼將會阻塞,等到forEach循環完以後執行
這是回調中沒有異步代碼的狀況。異步
再舉一個有異步的async
[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機制放入調用棧,繼續執行同步代碼以結束; 回調自己就是異步函數,放入調用棧,結束本次遍歷。函數
結合代碼理解:oop
Array.prototype.forEach = function (callback) { for(let index = 0; index < this.length; index++) { callback(this[index], index, this); } }
const sleep = (timer) => { return new Promise((resolve, reject) => { setTimeout(resolve, timer); }); } const foo = async () => { for (let i = 0; i < 5; i++) { await sleep(1000); console.log(i); } } foo(); // 從1到5,每隔一秒輸出一個數字