jsforeach异步的问题_js中forEach回调同异步题目
js中forEach自身是同步的
舉個(gè)栗子:
[many, too many, so many].forEach((value) => {
some code; // 這是一個(gè)大數(shù)值運(yùn)算(非異步代碼),須要幾毫秒的時(shí)候
});
other code; // 這些代碼將會(huì)壅塞,比及forEach輪回完以后實(shí)行
這是回調(diào)中沒有異步代碼的狀況。
再舉一個(gè)有異步的
[1, 2, 3].forEach((value) => {
setTimeout(function() {
some code;
}, 1000);
});
other code; // 這部份代碼不會(huì)被setTimeout壅塞,forEach遍歷完1,2,3以后就實(shí)行
[1, 2, 3].forEach( async (value) => {
let foo = await promiseFn();
});
other code; // 一樣不會(huì)遭到異步壅塞
上面是2種異步代碼情勢(shì), 然則都不會(huì)壅塞背面的代碼。我明白的是:forEach的回調(diào)函數(shù)會(huì)被馬上實(shí)行,回調(diào)里有異步代碼,依據(jù)EventLoop機(jī)制放入挪用棧,繼承實(shí)行同步代碼以完畢; 回調(diào)自身就是異步函數(shù),放入挪用棧,完畢本次遍歷。
連系代碼明白:
Array.prototype.forEach = function (callback) {
for(let index = 0; index < this.length; index++) {
callback(this[index], index, this);
}
}
關(guān)于通例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,每隔一秒輸出一個(gè)數(shù)字
總結(jié)
以上是生活随笔為你收集整理的jsforeach异步的问题_js中forEach回调同异步题目的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jquery链式写法 java_jQue
- 下一篇: java获取eureka_获取Eurek