面试问题(二)

87 阅读2分钟

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」。

一、promise.all()的方法

Promis是异步编程的解决方案,可以解决回调地狱的问题,避免了层层嵌套的问题

Promis 构造函数包含一个参数和一个带有 resolve(成功)和 reject(失败)两个参数的一个回调函数,在回调中可以执行一些操作,如果没有错误就调用 resolve ,反之调用 reject 。

已经实例化的 Promis 对象可以调用 then() 方法来传递 resolve 和 reject 方法作为回调

下面举个例子来说明 .then() 和 .catch()

        let p = new Promise((resolve, reject) => {
        //异步操作
        setTimeout(function(){
            var num = parseInt(Math.random()*100); //生成1-10
            if(num<=50){
                resolve(num)
            }
            else{
                reject('大于50')
            }
        }, 1000);
        })
        
        p.then(res=>{
            console.log(res) //resolve 中 num 的值
        },error=>{
            console.log(error) //报错: reject 中的信息
            console.log(1) //不用 .catch() 的话不会执行
        })
        
        p.then(res=>{
            console.log(res) //resolve 中 num 的值
        }).catch(error=>{
            console.log(error) //打印: reject 中的信息
             console.log(1) //会执行
        }) 

Promise.all() 用于将多个 Promise 实例,包装成一个新的 Promise 实例

Promise.all() 接受一个数组作为参数,数组里的元素都是 Promise 对象的实例

1.png

二、重绘回流

什么是重绘Repaint 和重排(回流 reflow)

重绘:当元素的一部分属性发生改变,如外观、背景、颜色等不会引起布局变化,只需要浏览器根据元素的新属性重新绘制,使元素呈现新的外观叫做重绘。

重排(回流):当render树中的一部分或者全部因为大小边距等问题发生改变而需要DOM树重新计算的过程

重绘不一定需要重排,重排必然导致重绘

如何最小化 重绘回流

  1. 需要对元素进行复杂操作时,可以先隐藏 display:none,操作完成后再显示
  2. 需要创建搓个DOM节点时,使用 DocumentFragment 创建完成后一次性加入
  3. 尽量避免table布局(table元素一旦发生重排就会使所有table发生重排)
  4. 避免使用css表达式(expression),因为每次调用都会重新计算
  5. 尽量使用css样式复合写法

2.png

加油加油!!

努力学习!!