对宏任务与微任务的理解

284 阅读2分钟

1.事件循环

要了解宏任务与微任务首先我们得了解 事件循环

事件循环:浏览器解析执行js代码的一种运行机制(规则)

js代码:可以分为两种

1.同步代码

2.异步代码:

(1)异步宏任务

例子:
a.事件
b.网络请求(ajax)
c.setTime()定时器

(2)异步微任务

1. Promise.then()//then才是异步,promise只是个容器

2.async/await

2.通过以下代码去学习宏任务与微任务

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        console.log(1);
        async function fnOne() {
            console.log(2);
            await fnTwo(); // 右结合先执行右侧的代码, 然后等待
            console.log(3);
        }
        async function fnTwo() {
            console.log(4);
        }
        fnOne();

        setTimeout(() => {
            console.log(5);
        }, 2000);

        let p = new Promise((resolve, reject) => { // new Promise()里的函数体会马上执行所有代码
            console.log(6);
            resolve();
            console.log(7);
        })

        setTimeout(() => {
            console.log(8)
        }, 0)

        p.then(() => {
            console.log(9);
        })
        console.log(10);
    </script>
    <script>
        console.log(11);
        let b = new Promise((resolve, reject) => { // new Promise()里的函数体会马上执行所有代码
            resolve(33);
        })
        b.then(res => {
            console.log(res)
        })
        setTimeout(() => {
            console.log(12);
            let p = new Promise((resolve) => {
                resolve(13);
            })
            p.then(res => {
                console.log(res);
            })
            console.log(15);
        }, 0)
        console.log(14);
    </script>
    <script>
        console.log(30)
        let c = new Promise((resolve, reject) => { // new Promise()里的函数体会马上执行所有代码
            resolve(37);
        })
        c.then(res => {
            console.log(res)
        })
    </script>
</body>

</html>

代码解析:根据以下内容分析代码

1.进入到script标签,就进入到了第一次事件循环.

2.遇到同步代码,立即执行

3.遇到宏任务,放入到宏任务队列里.

4.遇到微任务,放入到微任务队列里.

5.执行完所有同步代码

6.执行微任务代码

7.微任务代码执行完毕,本次队列清空

寻找下一个宏任务,重复步骤1

以此反复直到清空所以宏任务,这种不断重复的执行机制,就叫做事件循环

注意点:

代码中有三个script标签

后面两个script标签相对于第一个script来说就相当于两个特殊的宏任务

第一个script中的同步代码与异步微任务解析完成后 会去 解析第二个script的同步代码与异步微任务 以此类推.当三个script标签中的同步代码与异步微任务代码都解析完了,再开始依次解析异步宏任务.

陷阱:

  setTimeout(() => {
            console.log(5);
        }, 2000);
        *当宏任务设置了时间就会在最后执行,如果多个宏任务设置时间,时间越大的越后执行,依次解析.
        
        
     

3.执行结果:

snipaste20220523_201331.jpg