js中forEach回調同異步問題

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);
    }
}

對於常規for循環

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,每隔一秒輸出一個數字
相關文章
相關標籤/搜索