起因:js单线程,所有任务需要排队,但遇到耗时的操作(网络请求),就会堵塞后续的任务
解决:将耗时的操作放到异步任务队列,先执行同步的任务,等异步任务完成之后,通知主线程,再去执行
事件循环
- 所有同步任务都在主线程上执行,形成一个执行栈
- 主线程之外,还存在一个任务队列。只要异步任务有了运行结果,就在任务队列之中放置一个事件。
- 一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列,看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
- 主线程不断重复上面的第三步
MacroTask(宏任务)
script
全部代码
setTimeout
、setInterval
、setImmediate
I/O
、网络请求
UI Rendering
MicroTask(微任务)
Process.nextTick
(Node独有)
Promise
MutationObserver