async:
1. async 是異步的意思,await則可以理解為 async wait揍很。所以可以理解async就是用來(lái)聲明一個(gè)異步方法,而 await是用來(lái)等待異步方法執(zhí)行
async作為一個(gè)關(guān)鍵字放在函數(shù)前面万伤,表示該函數(shù)是一個(gè)異步函數(shù)窒悔,異步函數(shù)意味著該函數(shù)的執(zhí)行不會(huì)阻塞后面代碼的執(zhí)行;而 await 用于等待一個(gè)異步方法執(zhí)行完成壕翩;
async/await的作用就是使異步操作以同步的方式去執(zhí)行
async的用法蛉迹,在函數(shù)前面加上async關(guān)鍵字,表示函數(shù)是異步的放妈。
async function timeout() {
? ? return 'hello world!'
}
作用:async 函數(shù)返回的是一個(gè)promise 對(duì)象北救。即返回值將會(huì)被promise包裹,如果async函數(shù)中有返回值芜抒,當(dāng)調(diào)用該函數(shù)時(shí)珍策,內(nèi)部會(huì)調(diào)用Promise.resolve()方法把它轉(zhuǎn)化成一個(gè)promise對(duì)象作為返回
那么要想獲取到async 函數(shù)的執(zhí)行結(jié)果,就要調(diào)用promise的then 或 catch 來(lái)給它注冊(cè)回調(diào)函數(shù)
? async function timeout() {
? ?? return 'hello world!'
?? }
?? timeout().then(val => {
? ?? console.log(val)
?? })
?? console.log('我雖然在后面宅倒,但是先執(zhí)行')
1攘宙、async函數(shù)的執(zhí)行:會(huì)返回promise對(duì)象,并且把內(nèi)部的值進(jìn)行promise的封裝拐迁。如果promise對(duì)象通過(guò)then或catch方法又注冊(cè)了回調(diào)函數(shù)蹭劈,async函數(shù)執(zhí)行完以后,注冊(cè)的回調(diào)函數(shù)就會(huì)放到異步隊(duì)列中线召,等待執(zhí)行铺韧。
如果只是async,和promise差不多缓淹,但有了await就不一樣了哈打,await關(guān)鍵字只能放到async函數(shù)里面,2讯壶、await在等待什么呢料仗?
其實(shí)await不僅僅用于等Promise對(duì)象,還可以等任意表達(dá)式伏蚊,所以await后面實(shí)際是可以接普通函數(shù)調(diào)用或者直接量的立轧,**不過(guò)我們更多的是放一個(gè)返回promise 對(duì)象的表達(dá)式。他等待的是promise對(duì)象執(zhí)行完畢,并返回結(jié)果氛改。**
3匀借、await的作用:阻塞后邊的代碼
不管await后面跟著的是什么,await都會(huì)阻塞后面的代碼平窘。阻塞的是該函數(shù)內(nèi)部的代碼,而非整段代碼凳怨。
async function fn1 (){
? console.log(1)
? await fn2() // fn2進(jìn)入微任務(wù)隊(duì)列等待執(zhí)行
? console.log(2) // 阻塞
}
async function fn2 (){
? console.log('fn2')
}
fn1()
console.log(3)
// 輸出結(jié)果:1瑰艘,fn2,3肤舞,2
總結(jié):
async 函數(shù)1)函數(shù)的返回值為Promise對(duì)象2)Promise對(duì)象的結(jié)果由async函數(shù)執(zhí)行的返回值決定
await 表達(dá)式1)正常情況下紫新,await右側(cè)的表達(dá)式一般為 promise對(duì)象 , 但也可以是其它的值2)如果表達(dá)式是promise對(duì)象,await就忙起來(lái)了李剖,它會(huì)阻塞函數(shù)后面的代碼芒率,**等著Promise對(duì)象resolve,然后得到resolve的值篙顺,**作為await表達(dá)式的運(yùn)算結(jié)果偶芍。3)如果表達(dá)式是其它值, 直接將此值作為await的返回值
**async**和**await**基于promise的。使用async的函數(shù)將會(huì)始終返回一個(gè) promise 對(duì)象德玫。這一點(diǎn)很重要匪蟀,要記住,可能是你遇到容易犯錯(cuò)的地方宰僧。
在使用\**await\**的時(shí)候我們只是暫停了函數(shù)材彪,而非整段代碼。這里經(jīng)常會(huì)是容易犯錯(cuò)的地方琴儿。
async和await是**非阻塞的**
仍然可以使用 **Promise**段化,例如**Promise.all(p1, p2, p3)**.,接受一個(gè)數(shù)組作為參數(shù)造成,p1显熏、p2、p3 都是 Promise 實(shí)例谜疤,如果不是佃延,就會(huì)先調(diào)用 Promise .resolve方法,將參數(shù)轉(zhuǎn)為 Promise 實(shí)例夷磕,再進(jìn)一步處理履肃。只要 p1、p2坐桩、p3 之中有一個(gè)被 rejected尺棋,整個(gè)狀態(tài)就變成 rejected。
注意1)await必須寫(xiě)在async函數(shù)中, 但async函數(shù)中可以沒(méi)有await2)如果await的promise失敗了, 就會(huì)拋出異常, 需要通過(guò)**try…catch**來(lái)捕獲處理