同步 异步
JS是单线程,同步只能将任务按照顺序执行,也就是说只有上一个任务执行完后才能执行下一个,这种方式会阻塞其他任务。异步可以解决这个问题。 同步任务:所有同步任务都在主线程执行,形成一个执行栈。 异步任务:不进入主线程,而进入任务队列,只有任务队列通知主线程,当前异步任务完成了,才会进入执行栈中执行。 异步:同一时间可以做多个事情,执行效率高,但是会占用更多资源,不利于我们对进程进行控制。
理解js单线程和异步,这一篇就够了https://blog.csdn.net/gitchatxiaomi/article/details/108054585
图源:https://blog.csdn.net/qq_21033663/article/details/51564786
宏任务 微任务
异步任务的执行有优先级的顺序,包括了宏任务和微任务。 同步 -> 异步(微任务) -> 异步(宏任务) 每次执行完所有的同步任务后,会在任务队列中取出异步任务,先将所有微任务执行完成后,才会执行宏任务。所以可以得出结论,微任务会在宏任务之前执行。
参考:https://blog.csdn.net/weixin_52148295/article/details/110823063
[宏任务:macro task]
- 定时器
- 事件绑定
- ajax
- 回调函数
- Node中fs可以进行异步的I/O操作
[微任务:micro task]
Promise(async/await) => Promise 并不是完全的同步,当在Excutor中执行resolve或者reject的时候,此时是异步操作,会先执行then/catch等,当主栈完成后,才会再去调用resolve/reject把存放的方法执行process.nextTick (node中实现的api,把当前任务放到主栈最后执行,当主栈执行完,先执行nextTick,再到等待队列中找,微任务中,优先级较高)MutationObserver (创建并返回一个新的 MutationObserver 它会在指定的DOM发生变化时被调用。)
事件循环
【黑马文档】
- 先执行执行栈中的同步任务。
- 异步任务(回调函数)放入任务队列中。
- 一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行。
|