摘要:我理解的是的回調函數(shù)會被立即執(zhí)行,回調里有異步代碼,根據(jù)機制放入調用棧,繼續(xù)執(zhí)行同步代碼以結束回調本身就是異步函數(shù),放入調用棧,結束本次遍歷。
js中forEach本身是同步的
舉個栗子:
[many, too many, so many].forEach((value) => { some code; // 這是一個大數(shù)值運算(非異步代碼),需要幾毫秒的時間 }); other code; // 這些代碼將會阻塞,等到forEach循環(huán)完之后執(zhí)行
這是回調中沒有異步代碼的情況。
再舉一個有異步的
[1, 2, 3].forEach((value) => { setTimeout(function() { some code; }, 1000); }); other code; // 這部分代碼不會被setTimeout阻塞,forEach遍歷完1,2,3之后就執(zhí)行 [1, 2, 3].forEach( async (value) => { let foo = await promiseFn(); }); other code; // 同樣不會受到異步阻塞
上面是2種異步代碼形式, 但是都不會阻塞后面的代碼。我理解的是:forEach的回調函數(shù)會被立即執(zhí)行,回調里有異步代碼,根據(jù)EventLoop機制放入調用棧,繼續(xù)執(zhí)行同步代碼以結束; 回調本身就是異步函數(shù),放入調用棧,結束本次遍歷。
結合代碼理解:
Array.prototype.forEach = function (callback) { for(let index = 0; index < this.length; index++) { callback(this[index], index, this); } }對于常規(guī)for循環(huán)
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,每隔一秒輸出一個數(shù)字
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/101858.html