简介:
js是一门单线程语言,意味着在同一时间只能做一件事,但并不意味这单线程就是阻塞,而实现单线程非阻塞的方法就是事件循环。
两种任务:
在js中任务可以分为两种:同步任务 和 异步任务
同步任务:立即执行任务,同步任务一般直接进入主线程中
异步任务:异步执行的任务,如ajax网络请求等
事件循环:
同步任务进入主线程,即主执行栈,异步任务进入任务队列,主线程内的任务执行完毕为空,会去任务队列读取对应的任务。推入主线程,重复执行上述过程就是事件循环
宏任务和微任务
将任务分为同步任务和异步任务并不准确,因为,异步任务是存放在队列中的,而队列讲究一个先进先出,排在前面的任务,会优先执行,可事实并非如此,原因在与异步任务还可以分为宏任务 和 微任务
微任务
一个需要异步执行的函数,执行时机是在主函数执行结束之后,当前宏任务结束之前 常见的微任务有: Promise.then 、MutaionObserver、Object.observe(已废弃;Proxy 对象替代)、process.nextTick(Node.js)
宏任务
宏任务的时间粒度比较大,执行的时间间隔是不能精确控制的,对一些高实时性的需求不太符合 常见的宏任务有: script(可以理解为外层同步代码),setTimeout/setInterval、UI rendering/UI事件、postMessage、MessageChannel。
执行机制
执行一个宏任务,如果遇到微任务就将他放到微任务的事件队列中
当前宏任务执行完成后,会查看微任务的事件队列,然后将里面的微任务依次执行完毕
async和await
async是用来声明一个异步方法,而await是用来等待异步方法执行
async返回一个promise对象
await后面跟一个promise对象,返回该对象的结果,如果不是promise对象,就直接返回结果。