event-loop(事件轮询)
代码进入执行栈后会判断当前代码是同步任务仍是异步任务,若是是同步任务则会将任务调到主线程同步执行,若是是异步任务则会将任务调到异步队列中。ajax
主线程同步任务执行完毕后,会检测异步队列中是否存在异步任务:异步
- 若存在异步任务则先检测是否有定时器任务,若是有并时间到则执行定时器异步任务;
- 若不存在定时器任务或定时器时间未到则检测是否存在io异步任务,如文件读写,ajax请求等。若存在则执行io异步任务;
- 若不存在io异步任务或已执行完毕io异步任务,则检测是否存在setImmediate异步任务,若存在则执行该异步任务;
- 1,2,3条结束后从新判断异步队列中是否还存在未执行的异步任务,若存在,则从第一条开始检测执行,若异步队列未空,则结束。
宏任务 & 微任务
主线程中执行的同步任务又分宏任务与微任务。函数
宏任务包含:oop
- 主体script代码
- setTimeout,setInterval函数
- Promise
微任务包含:线程
- Promise对象的then处理
- process.nextTick
当同步任务中既包含宏任务又包含微任务的时候,执行顺序是先执行宏任务,再执行微任务。对象