多个微任务之间,会进行DOM的渲染吗?

924 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

前言

我们已经知道在浏览器的一个Event Loop「一个微任务在DOM渲染前执行」,那么在这个Event Loop里,「多个微任务之间,会进行DOM的渲染吗」

代码

先看一段代码

html

<ul id="text"></ul>

js

const divs = document.getElementById("text");

        setTimeout(() => {
            console.log(divs.outerHTML, "setTimeout");
            var big = document.createElement("li");
            big.innerHTML = "我是setTimeout插入的内容";
            divs.appendChild(big);
        }, 0);

        new Promise((resolve, reject) => {
            resolve("我是Promise.then1插入的内容");
        }).then((msg) => {
            console.log(divs.outerHTML, "Promise.then1");
            var small = document.createElement("li");
            small.innerHTML = msg;
            divs.appendChild(small);
        });

        new Promise((resolve, reject) => {
            resolve("我是Promise.then2插入的内容");
        }).then((msg) => {
            console.log(divs.outerHTML, "Promise.then2");
            divs.setAttribute("style", "color:red");
        });

        new Promise((resolve, reject) => {
            resolve("我是Promise.then3插入的内容");
        }).then((msg) => {
            console.log(divs.outerHTML, "Promise.then3");
            var small = document.createElement("li");
            small.innerHTML = msg;
            divs.appendChild(small);
        });

结果

日志

见下图,其中,then2里对dom的操作是为了检测重绘,then1里对dom的操作是为了检测回流,从日志的角度来看,不论是哪种渲染机制,都会在多次微任务执行的间隙进行

image.png

DOM

image.png

总结

多个微任务之间,会进行DOM的渲染,并且不论是回流还是重绘