微任务与宏任务

微任务与宏任务

微任务与宏任务

同步代码>微任务>宏任务

定时器任务

首先时间,每个浏览器不同,但一般最小4ms;很少会定义个位数的毫秒;

代码执行到setTimeout时,定时器模块就会记录下这个定时器,此时会开始计时,当时间到了会将回调放到任务队列里面(等待下次被调度),等待下一次的轮询时把任务拿到主程序来执行

定时器的时间通常是不准的,因为一定要等主线程空闲了才去执行定时器任务,一定是要排队的

setTimeout(()=>{
    console.log('定时器 1')
},2000)
setTimeout(()=>{
    console.log('定时器 2')
},1000)
console.log('javascript');

微任务promise

promise构造函数这里是同步代码

红任务中产生了微任务,是在宏任务之后

setTimeout(()=>{
    console.log('settimeout')
    new Promise(resolve=>{
        console.log('settimeout promise');
        resolve()
    }).then(()=> console.log('settimeout then'))
},0)
new Promise(resolve=>{
    console.log('promise');
    resolve();
}).then(value=>{
    console.log('then')
})
console.log('javascript');

总结:

同步代码已经开始干活的代码,在主线程中立即执行的代码

微任务优先级大于宏任务;

在执行宏任务的过程中可能又产生了微任务(或宏任务),等到下一轮轮询

dom渲染任务

dom渲染任务也可以理解为另一个宏任务,将script标签放在body的底部,使其不阻塞渲染

任务共享内存

任务是一个一个来调度的,一个一个来执行的

执行时都在一个线程里面,之前内存中的数据是可以用的,共享内存

let i=0;
setTimeout(()=>{
    console.log(++i);
},1000)
setTimeout(()=>{
    console.log(++i);
},1000)

任务轮询

function handle(){
    let i=0;
    (function run(){
        if(++i<=100){
            const div=document.querySelector('div')
            div.style.width=i+'%';
            setTimeout(run,10)
        }
        
    })();
}
handle()

<body>
    <div style="height:30px;background:red;width:0px"></div>
</body>

拆分任务

用settimeout拆分

let count = 0;
let number = 987654321;
function hd() {
    for (let i = 0; i < 10000000; i++) {
        if (number <= 0) break;
        count += number--;
    }
    if (number > 0) {
        setTimeout(hd);
        console.log(count)
        console.log(number)
    } else {
        console.log(count)
        console.log(number)
    }

}
hd()

console.log('abc')

使用promise

如果一个任务计算时间比较长,不希望影响同步代码,就可以使用异步的形式,settimeout宏任务或者promise微任务

ece3440d2e439eb302f5a9cb18286655.png

附上b站链接:第十六章 JS中的宏任务与微任务,及JAVASCRIPT任务调度流程,ES6必学知识_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值