JavaScript的事件分两种,宏任务(macro-task)和微任务(micro-task)
宏任务:包括整体代码script,setTimeout,setInterval
微任务:Promise.then(非new Promise),process.nextTick(node中)
事件的执行顺序是先执行宏任务,然后执行微任务,然后任务有同步任务和异步任务,同步任务进入主线程,异步任务进入Event Table并注册函数,异步队列执行完毕后,会把回掉函数放在Event Queue(任务队列)宏任务和微任务是不同的任务队列,同步任务执行完毕之后,回去任务队列读取事件放在主线程进行执行,循环上述操作
setTimeOut为什么不能精准的执行的问题
需要满足两个条件:
- 主进程必须是空闲的状态,如果到时间了,主进程不空闲也不会执行你的回调函数函数
- 这个回调函数需要等到插入异步队列时前面的异步函数都执行完了,才会执行
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