EvenLoop,js的事件循环机制

JavaScript的事件分两种,宏任务(macro-task)和微任务(micro-task)

宏任务:包括整体代码script,setTimeout,setInterval
微任务:Promise.then(非new Promise),process.nextTick(node中)

事件的执行顺序是先执行宏任务,然后执行微任务,然后任务有同步任务和异步任务,同步任务进入主线程,异步任务进入Event Table并注册函数,异步队列执行完毕后,会把回掉函数放在Event Queue(任务队列)宏任务和微任务是不同的任务队列,同步任务执行完毕之后,回去任务队列读取事件放在主线程进行执行,循环上述操作
setTimeOut为什么不能精准的执行的问题
需要满足两个条件:

  1. 主进程必须是空闲的状态,如果到时间了,主进程不空闲也不会执行你的回调函数函数
  2. 这个回调函数需要等到插入异步队列时前面的异步函数都执行完了,才会执行

promise、async/await
new Promise是同步的任务,就是普通的js代码,会被放到主进程中去立即执行
但是.then()函数是异步任务,等promise状态结束的时候会放在异步队列

async/await。也是同步任务,但是他会等待await右侧的表达式执行完毕之后,就放出主线程,阻止await后续的代码,等外面的同步代码执行完毕之后,才会执行里面的后续代码

总结的优先级别
宏任务 => 微任务的Event Queue => 宏任务的Event Queue

同步代码(宏任务)> await后续代码 > Promise(微任务)> setTimeout(fn)、setInterval(fn)(宏任务)> setTimeout(fn, time)、setInterval(fn, time),其中time>0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值