使用 async await 配合 promise是解決回調(diào)地獄的終極方法 async/await特點(diǎn)
1, async/await更加語(yǔ)義化,async 是“異步”的簡(jiǎn)寫,async function 用于申明一個(gè) function 是異步的; await,可以認(rèn)為是async wait的簡(jiǎn)寫, 用于等待一個(gè)異步方法執(zhí)行完成;
2, async/await是一個(gè)用同步思維解決異步問(wèn)題的方案(等結(jié)果出來(lái)之后,代碼才會(huì)繼續(xù)往下執(zhí)行)
3, 可以通過(guò)多層 async function 的同步寫法代替?zhèn)鹘y(tǒng)的callback嵌套 async function語(yǔ)法
1)自動(dòng)將常規(guī)函數(shù)轉(zhuǎn)換成Promise,返回值也是一個(gè)Promise對(duì)象
2)只有async函數(shù)內(nèi)部的異步操作執(zhí)行完,才會(huì)執(zhí)行then方法指定的回調(diào)函數(shù)
3)異步函數(shù)內(nèi)部可以使用await await語(yǔ)法
await 放置在Promise調(diào)用之前,await 強(qiáng)制后面點(diǎn)代碼等待,直到Promise對(duì)象resolve,得到resolve的值作為await表達(dá)式的運(yùn)算結(jié)果
await只能在async函數(shù)內(nèi)部使用,用在普通函數(shù)里就會(huì)報(bào)錯(cuò)
函數(shù)形式 function timeout(ms) { return new Promise((resolve, reject) => { setTimeout(() => {reject('error')}, ms); //reject模擬出錯(cuò),返回error }); } async function asyncPrint(ms) { try { console.log('start'); await timeout(ms); //這里返回了錯(cuò)誤 console.log('end'); //所以這句代碼不會(huì)被執(zhí)行了 } catch(err) { console.log(err); //這里捕捉到錯(cuò)誤error } }