事件循环机制
事件循环练习
由于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');
复制代码 点击查看答案2️⃣
- const promise = new Promise((resolve, reject) => {
- console.log(1);
- console.log(2);
- });
- promise.then(() => {
- console.log(3);
- });
- console.log(4);
复制代码 点击查看答案3️⃣
- 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 → 4
复制代码 4️⃣
- 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);
复制代码 点击查看答案5️⃣
- 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 → Timeout1
复制代码- function 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
复制代码 来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除 |