概述
javascript是一门单线程语言,js任务是一个一个顺序执行,分为同步任务和异步任务,同步任务会进入主线程,异步任务会进入Event Table(事件表),当时间表中的异步任务完成后就会在Event Queue(事件队列)中注册回调函数,主线程任务全部完成后,才会执行Event Queue中的回调,js解析器会不断重复检查主线程执行栈是否为空,然后重复第3步,这就是Event Loop(事件循环)
简单来说就是:
先同步后异步
遇到new Promise先执行
先微任务后宏任务
宏任务与微任务
macro-task(宏任务):包括整体代码script,setTimeout,setInterval, setImmediate(浏览器暂时不支持,只有IE10支持,具体可见MDN)、I/O、UI Rendering。
micro-task(微任务):Promise.then,process.nextTick
总结
- 一般的JavaScript代码(同步)的属于宏任务,定时器相关的异步代码,包括setTimeOut、setInterval等也属于宏任务,promise.then、 process.nextTick属于微任务;
- 同步的代码会按照执行顺序顺序执行,遇到异步代码的时候,属于宏任务的放到宏队列,微任务放到微队列,其中promise需要resolve或者reject才会执行then或者catch里面的内容,其他的放到队列的属于回调函数的内容。
- 执行顺序是宏任务-微任务-宏任务……,因为整个脚本就是一个宏任务,所以当里面宏任务和微任务同时放入队列,会先执行玩微任务再执行宏任务;前提是代码执行完毕,如果存在嵌套关系,则会先执行完该任务再执行下一个任务,如果问题复杂建议通过画图来理清楚
- process.nextTick只能在node环境下运行
async await 与 Promise
- async声明的必须是一个function,并且必须紧跟着function
async function process() {
}
- await必须在async声明的函数内部使用,必须是直系
- async生命的函数本质上是一个Promise
1 |
|
- await的本质是提供等同于“同步效果”的等待异步返回能力的语法糖,实质上就是返回一个Promise
- await意为等一会,只要await生命的函数还没有返回,下面的内容就不会被执行,准确的说是用await声明的Promise异步返回,必须等待到有返回值之后,才继续执行以后的代码
- async/await的错误处理
- async/await的终止程序(中断)
- Promise本身是无法终止的,只是一个状态机,包含三种状态pending(挂起)、resolve(成功)、reject(拒绝),一旦发出请求必须结束,无法取消,想要中断的时候直接return 一个值即可,return之后的操作将都会停止