前言
Async函数是ES7引入的用来操作异步的函数,在语法上,Async 函数与Generator 函数非常的类似,在对象性质上,Async 函数与Promise对象又是密不可分的。
一、JavaScript的运行机制
在我们探究Async函数内部运行机制执行,我们不得不来先说一说JavaScript这门语言的的运行机制。JavaScript的执行是单线程的,单线程的异步,其实只是按照某种规则以同步的方式分配利用CPU,而产生的异步效果。
在JavaScript内部,我们可以划分出来两种任务类型:
1.宏任务(macro-task)
类似:包括整体代码script,setTimeout,setInterval这样的语句都会开启一个宏任务,
当执行Script代码块时,则作为第一个宏任务启动。
每当启动一个宏任务,JavaScript都会将其置入一个称之为任务队列的任务池中,之后,一旦当前的宏任务结束时,线程将会在任务池中以任务置入的先后顺序来获取新的宏任务进入线程执行,周而复始,直至所有的宏任务结束。
需要注意的是:
如果当前的宏任务下有微任务,则执行完所有的微任务后才能空出线程,执行排在后面的宏任务
那么什么又是微任务呢?
2.微任务(micro-task)
类似: Promise 对象就是产生微任务的代表
每个微任务将会绑定到当前的宏任务下,微任务的置入以及取出机制与宏任务是一致的,但是,微任务在产生的同时还会绑定到当前运行的宏任务下面,也就是说,只有当前的微任务全部执行完毕,该宏任务才可能被执行结束。
每个微任务会被放入队列池(Event Queue),之后,线程若空出来则按放入的先后顺序执行
了解完JavaScript的运行机制,接下来就让我们来探究Async函数机制。
二、Async函数内部运行机制
理解下面代码运行:
function hh() {
console.log("hhh");
return "hhhhhhh";
}
async fun