【事件循环】:微任务与页面渲染的先后顺序

1,075 阅读1分钟

DOM渲染会在微任务执行完毕后执行?

现代JavaScript教程中给出的顺序

image.png

微任务会在DOM渲染之前完成

Chrome浏览器的实验

  1. 实验步骤 点击按钮触发两个Promise微任务,在第一个微任务中修改DOM,在第二个微任务中debugger,暂停代码。

  2. 实验期望:

  • 如果页面已经更新,则说明在第二个微任务完成前九已经渲染DOM了
    
  • 如果页面还未更新,则说明微任务未完成前不会渲染DOM
    
  1. 测试代码
<!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>
    <div id="box"></div>
    <button id="btn">按钮</button>
    <script>
        let div = document.getElementById('box')
        let btn = document.getElementById('btn')

        btn.addEventListener('click', () => {
            Promise.resolve().then(() => {
                console.log('微任务1')
                div.innerHTML = '微任务1'
            }).then(()=>{
                debugger
                console.log('微任务2')               
            })

        })
    </script>
</body>

</html>
  1. 实验结果 在微任务1结束后,微任务2开始前就已经渲染DOM了

image.png

在 微软Edge浏览器上测试

image.png

结论

现代JavaScript教程网站上认为在一次事件循环中,所有的微任务会先于DOM渲染执行。但经过浏览器实际测试发现,在微任务之间也会进行DOM渲染。