笃扇 发表于 2025-7-11 14:51:06

事件循环机制

事件循环机制

事件循环练习
由于js是单线程,为防止代码阻塞,将代码分为同步和异步,同步代码会直接放入执行栈中执行,异步代码(如setTimeout)放入宿主环境(浏览器,Node)中,时机到了(点击事件即点击后,setTimeout即时间结束后)以后将回调函数放入任务队列中,执行栈中的代码执行完后就会去任务队列中查看有无异步代码要执行。反复循环查看执行,这个过程就是事件循环。

js又把异步任务分为宏任务(由宿主环境发起,如script,事件,网络请求Ajax/Fetch,setTimeout()/setInterval())和微任务(由JS引擎发起,如Promise,Promise本身同步,then/catch回调函数异步)

注意⚠️


[*]排前面的 script 先执行,执行其内部的【同】,再执行其【微】,接着就轮到下一个大的宏,也就是执行下一个 script,【同】、【微】......顺序执行完后,再从头开始,看第一个 script 是否有需要执行的【宏】,再去下一个 script 中找 【宏】,等大家宏结束后,进入下一轮循环。


[*]async函数里面的属于同步代码,await后的代码属于异步微任务

Practice

1️⃣

console.log('A');·
setTimeout(() => console.log('B'), 0);
Promise.resolve().then(() => console.log('C'));
Promise.resolve().then(() => setTimeout(() => console.log('D'), 0));
console.log('E');点击查看答案A → E → C → B → D2️⃣

const promise = new Promise((resolve, reject) => {
console.log(1);
console.log(2);
});
promise.then(() => {
console.log(3);
});
console.log(4);点击查看答案 1 → 2 → 43️⃣

async function async1() {
console.log('1');
await async2();
console.log('2');
}
async function async2() { console.log('3'); }
setTimeout(() => console.log('4'), 0);
async1();
new Promise(resolve => {
console.log('5');
resolve();
}).then(() => console.log('6'));
console.log('7');点击查看答案 1 → 3 → 5 → 7 → 2 → 6 → 44️⃣

new Promise((resolve) => {
console.log(1);
resolve(3);
Promise.resolve().then(() => {
    console.log(4);
});
}).then((num) => {
console.log(num);
});

setTimeout(() => {
console.log(6);
});

Promise.resolve().then(() => {
console.log(5);
});
console.log(2);点击查看答案 1 → 2 → 4 → 3 → 5 → 65️⃣

console.log('start');
setTimeout(() => {
console.log('Timeout1');
}, 1000);

Promise.resolve().then(() => {
console.log('Promise1');
});

Promise.resolve().then(() => {
console.log('Promise2');
setTimeout(() => {
    Promise.resolve().then(() => {
      console.log('Promise3');
    })
    console.log('Timeout2');
}, 0);
});
console.log('end');点击查看答案 start → end → Promise1 → Promise2 → Timeout2 → Promise3 → Timeout1function app() {
setTimeout(() => {
    console.log("1-1");3
    Promise.resolve().then(() => {
      console.log("2-1");5
    });
});
console.log("1-2"); 1
Promise.resolve().then(() => {
    console.log("1-3"); 2
    setTimeout(() => {
      console.log("3-1"); 4
    });
});
}点击查看答案 1-2 → 1-3 → 1-1 → 3-1 → 2-1
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除
页: [1]
查看完整版本: 事件循环机制