JavaScript async/await使用詳解
一、簡介
async/await是ES20717引入的,主要是簡化Promise調(diào)用操作,實(shí)現(xiàn)了以異步操作像同步的方式去執(zhí)行,async外部是異步執(zhí)行的,同步是await的作用。
二、async
async,英文意思是異步,當(dāng)函數(shù)(包括函數(shù)語句、函數(shù)表達(dá)式、Lambda表達(dá)式)前有async關(guān)鍵字的時(shí)候,并且該函數(shù)有返回值,函數(shù)執(zhí)行成功,那么該函數(shù)就會(huì)調(diào)用Promise.resove()并隱式的返回一個(gè)Promise對象;如果函數(shù)執(zhí)行失敗就會(huì)調(diào)用Promise.reject()并返回一個(gè)Promise對象。
Promise.resolve(x) 可以看作是 new Promise(resolve => resolve(x)) ,可將字面量對象或其他對象快速封裝成 Promise 實(shí)例
- async函數(shù)中如果有異步操作會(huì)進(jìn)行等待,但是async函數(shù)本身會(huì)馬上返回,不會(huì)阻塞當(dāng)前線程。async函數(shù)被調(diào)用不會(huì)阻塞界面渲染,內(nèi)部由await關(guān)鍵字修飾異步過程,會(huì)阻塞等待異步任務(wù)的完成再返回。
- 如果在函數(shù)中return一個(gè)直接量,async會(huì)把這個(gè)直接量通過Promise.resolve(直接量) 封裝成 Promise 對象 ,如果沒有返回值,相當(dāng)于返回了Promise.resolve(undefined)。
- 通過Promise回調(diào)得到async函數(shù)的返回值 ,通過Promise回調(diào)得到async函數(shù)的返回值,因?yàn)樵摵瘮?shù)返回的是Promise對象
async func(){ return "a" } console.log(func()) func().then(res=>{ console.log(res) //通過回掉獲取到 a }.catch(err=>{ }))
func()的返回值如下,由此可見返回的是一個(gè)Promise對象。
三、await
使用await時(shí),一定要配合async使用 ,這樣才能使異步代碼同步化,await英文為等待,意思就是等待await后面的函數(shù)(該函數(shù)返回的是Promise對象)執(zhí)行完之后,在之后后面的代碼。
await后面也可以跟同步代碼 ,這樣做的話意義不大,增加了系統(tǒng)處理邏輯,系統(tǒng)會(huì)自動(dòng)將其轉(zhuǎn)化成一個(gè)Promsie對象。比如:
const a = await '1'; const a = await Promise.resolve('1');//跟上面效果效果相同 //await后跟同步代碼,不如不使用await,增加了代碼邏輯,沒有意義 const a = '1';
await在等返回值,后面可以是字面量或者函數(shù)表達(dá)式。如果表達(dá)式的運(yùn)算結(jié)果不是Promise對象,那么該結(jié)果就是await等的值; 如果await后是一個(gè)Promise對象,那么就會(huì)阻塞后面代碼的運(yùn)行 。但是async函數(shù)的調(diào)用并不會(huì)阻塞,它內(nèi)部所有的阻塞都封裝在Promise對象中異步執(zhí)行。
await只處理resolve(data)時(shí)的數(shù)據(jù),不處理reject(error) ,當(dāng)異步函數(shù)體內(nèi)出錯(cuò)的時(shí)候,怎么捕獲到錯(cuò)誤信息呢?
- 可以讓await后的函數(shù)通過catch獲取
- 通過最外面的func函數(shù)的catch獲取
- func函數(shù)體內(nèi)使用try…catch…,然后從catch獲取, try…catch可獲取 async 函數(shù)內(nèi),任意 await 的錯(cuò)誤,其中一個(gè)被拒絕,便會(huì)暫停,返回錯(cuò)誤信息。
async function func(){ const a = await asyncFunc(); } asyncFunc().then().catch()
async function func(){ const a = await asyncFunc(); } func().then().catch()
async function func(){ try(){ const a = await asyncFunc(); }catch(error){ } }
四、案例
async function func(){ console.log('a') const c = await 'c' console.log(c) return 'd' } func().then(res=>console.log(res)) console.log('b')
輸出:
先輸出a后輸出b,說明async函數(shù)執(zhí)行后會(huì)立即返回,不阻塞線程。
附-直接量/字面量
文中提到了字面量,博文在這里做下介紹。
字面量又稱之為直接量,代碼中固定值的表示方法,程序中直接使用的數(shù)據(jù),沒進(jìn)行過封裝。可分為字符串字面量(string literal)、數(shù)組字面量(array literal)、對象字面量(object literal),函數(shù)字面量(function literal)。 一般除去函數(shù)表達(dá)式,在給變量賦值時(shí),可以理解為=號(hào)右邊的數(shù)據(jù) 。
var a = "1"; var b = [1]; var c = {}; var d =function (){} // function() 為匿名函數(shù)
注意:函數(shù)字面量一般為匿名函數(shù),但是語法也支持定義函數(shù)名。
var d =function func(){}
到此這篇關(guān)于JavaScript async/await使用詳解的文章就介紹到這了,更多相關(guān)JS async/await內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript數(shù)據(jù)結(jié)構(gòu)之二叉樹的計(jì)數(shù)算法示例
這篇文章主要介紹了JavaScript數(shù)據(jù)結(jié)構(gòu)之二叉樹的計(jì)數(shù)算法,結(jié)合具體實(shí)例形式分析了javascript二叉樹記錄更新次數(shù)的原理與操作技巧,需要的朋友可以參考下2017-04-04Three.js利用Detector.js插件如何實(shí)現(xiàn)兼容性檢測詳解
這篇文章主要給大家介紹了關(guān)于Three.js利用Detector.js插件如何實(shí)現(xiàn)兼容性檢測的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-09-09javascript html5實(shí)現(xiàn)表單驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了javascript html5實(shí)現(xiàn)表單驗(yàn)證的具體代碼,感興趣的小伙伴們可以參考一下2016-03-03Javascript的各種節(jié)點(diǎn)操作實(shí)例演示代碼
實(shí)例演示對javascript的節(jié)點(diǎn)的各種操作。包括hasChildNodes(),removeChild(),appendChild(),replaceChild(),insertBefore(),cloneNode()等2012-06-06JS數(shù)組reduce你不得不知道的25個(gè)高級用法
reduce作為ES5新增的常規(guī)數(shù)組方法之一,對比forEach 、filter和map,在實(shí)際使用上好像有些被忽略,下面這篇文章主要給大家介紹了關(guān)于JS數(shù)組reduce你不得不知道的25個(gè)高級用法,需要的朋友可以參考下2021-06-06JavaScript實(shí)現(xiàn)異步獲取表單數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)異步獲取表單數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05Webpack框架核心概念(知識(shí)點(diǎn)整理)
webpack 是一個(gè)現(xiàn)代 JavaScript 應(yīng)用程序的模塊打包器(module bundler)。這篇文章主要介紹了Webpack框架核心概念(知識(shí)點(diǎn)整理),需要的朋友可以參考下2017-12-12JavaScript?ES6模塊導(dǎo)入和導(dǎo)出的方法
ES6在語言標(biāo)準(zhǔn)的層面上實(shí)現(xiàn)了模塊功能,而且實(shí)現(xiàn)的相當(dāng)簡單,完全可以取代CommonJS和AMD規(guī)范,成為瀏覽器和服務(wù)器通用的模塊解決方案,下面這篇文章主要給大家介紹了關(guān)于ES6模塊導(dǎo)入和導(dǎo)出的方法,需要的朋友可以參考下2022-07-07