亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

js中forEach回調同異步問題

chenjiang3 / 1755人閱讀

摘要:我理解的是的回調函數(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

Failed to recv the data from server completely (SIZE:0/8, REASON:closed)