柯倪的实验室
返回文章列表

EventLoop,任务队列,宏任务,微任务关系说明

EventLoop是什么

EventLoop是JavaScript的主线程不断循环读取异步任务队列(event queue)的机制

JavaScript为避免多线程操作带来的复杂dom操作,将js设计成了单线程机制,而单线程意味如果在某一个操作任务卡死或者耗时太久,基本用户就退了。于是提出了Web Worker,让js创建子线程来模拟实现多线程,而众多子线程中,有一个就是EventLoop,会一直读取任务

任务队列是什么

任务队列储存异步函数的回调,独立与线程之外。主线程会通过eventloop读取任务队列中准备好的异步函数回调,注意是回调,只有异步函数的回调会进任务队列,而任务队列中又分为宏任务和微任务

宏任务和微任务

常见的宏任务有script代码块,settimeout,i/o操作等,微任务如Promise的各种回调, 执行过程请看图 image.png

需要注意的是当执行完第一个宏任务,不会再继续执行下一个宏任务,优先开始处理完所有的微任务

好了,理论介绍完毕,来几个代码

代码执行

<script>
    //第一个代码块
        setTimeout(() => {
            console.log(1)
        }, 0)
        new Promise((reslove) => {
            console.log(2)
            reslove()
        }).then(() => {
            console.log(3)
        })
    </script>
    <script>
        //第二个代码块
        setTimeout(() => {
            console.log(4)
        }, 0)
        new Promise((reslove) => {
            console.log(5)
            reslove()
        }).then(() => {
            console.log(6)
        })
    </script>
    /// 输出结果
    2
    3
    5
    6
    1
    4

js遇到第一个settimeout和promise,全部扔到异步队列,因为script整体就是一个宏任务,不会立即执行这个settimeout,而是开始执行微任务,所以先输出2,3,继续执行下一个script宏任务,而因为js刚开始会执行所有的代码,开始运行第二个script代码块,输出5,6,而两个settimeout进入队列的时间最晚,所以1,4最后输出

前端