JavaScript async/await使用詳解
一、簡介
async/await是ES20717引入的,主要是簡化Promise調(diào)用操作,實現(xiàn)了以異步操作像同步的方式去執(zhí)行,async外部是異步執(zhí)行的,同步是await的作用。
二、async
async,英文意思是異步,當函數(shù)(包括函數(shù)語句、函數(shù)表達式、Lambda表達式)前有async關鍵字的時候,并且該函數(shù)有返回值,函數(shù)執(zhí)行成功,那么該函數(shù)就會調(diào)用Promise.resove()并隱式的返回一個Promise對象;如果函數(shù)執(zhí)行失敗就會調(diào)用Promise.reject()并返回一個Promise對象。
Promise.resolve(x) 可以看作是 new Promise(resolve => resolve(x)) ,可將字面量對象或其他對象快速封裝成 Promise 實例
- async函數(shù)中如果有異步操作會進行等待,但是async函數(shù)本身會馬上返回,不會阻塞當前線程。async函數(shù)被調(diào)用不會阻塞界面渲染,內(nèi)部由await關鍵字修飾異步過程,會阻塞等待異步任務的完成再返回。
- 如果在函數(shù)中return一個直接量,async會把這個直接量通過Promise.resolve(直接量) 封裝成 Promise 對象 ,如果沒有返回值,相當于返回了Promise.resolve(undefined)。
- 通過Promise回調(diào)得到async函數(shù)的返回值 ,通過Promise回調(diào)得到async函數(shù)的返回值,因為該函數(shù)返回的是Promise對象
async func(){
return "a"
}
console.log(func())
func().then(res=>{
console.log(res) //通過回掉獲取到 a
}.catch(err=>{ }))
func()的返回值如下,由此可見返回的是一個Promise對象。

三、await
使用await時,一定要配合async使用 ,這樣才能使異步代碼同步化,await英文為等待,意思就是等待await后面的函數(shù)(該函數(shù)返回的是Promise對象)執(zhí)行完之后,在之后后面的代碼。
await后面也可以跟同步代碼 ,這樣做的話意義不大,增加了系統(tǒng)處理邏輯,系統(tǒng)會自動將其轉(zhuǎn)化成一個Promsie對象。比如:
const a = await '1';
const a = await Promise.resolve('1');//跟上面效果效果相同
//await后跟同步代碼,不如不使用await,增加了代碼邏輯,沒有意義
const a = '1';
await在等返回值,后面可以是字面量或者函數(shù)表達式。如果表達式的運算結(jié)果不是Promise對象,那么該結(jié)果就是await等的值; 如果await后是一個Promise對象,那么就會阻塞后面代碼的運行 。但是async函數(shù)的調(diào)用并不會阻塞,它內(nèi)部所有的阻塞都封裝在Promise對象中異步執(zhí)行。
await只處理resolve(data)時的數(shù)據(jù),不處理reject(error) ,當異步函數(shù)體內(nèi)出錯的時候,怎么捕獲到錯誤信息呢?
- 可以讓await后的函數(shù)通過catch獲取
- 通過最外面的func函數(shù)的catch獲取
- func函數(shù)體內(nèi)使用try…catch…,然后從catch獲取, try…catch可獲取 async 函數(shù)內(nèi),任意 await 的錯誤,其中一個被拒絕,便會暫停,返回錯誤信息。
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í)行后會立即返回,不阻塞線程。
附-直接量/字面量
文中提到了字面量,博文在這里做下介紹。
字面量又稱之為直接量,代碼中固定值的表示方法,程序中直接使用的數(shù)據(jù),沒進行過封裝。可分為字符串字面量(string literal)、數(shù)組字面量(array literal)、對象字面量(object literal),函數(shù)字面量(function literal)。 一般除去函數(shù)表達式,在給變量賦值時,可以理解為=號右邊的數(shù)據(jù) 。
var a = "1";
var b = [1];
var c = {};
var d =function (){} // function() 為匿名函數(shù)
注意:函數(shù)字面量一般為匿名函數(shù),但是語法也支持定義函數(shù)名。
var d =function func(){}
到此這篇關于JavaScript async/await使用詳解的文章就介紹到這了,更多相關JS async/await內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JavaScript數(shù)據(jù)結(jié)構(gòu)之二叉樹的計數(shù)算法示例
這篇文章主要介紹了JavaScript數(shù)據(jù)結(jié)構(gòu)之二叉樹的計數(shù)算法,結(jié)合具體實例形式分析了javascript二叉樹記錄更新次數(shù)的原理與操作技巧,需要的朋友可以參考下2017-04-04
Three.js利用Detector.js插件如何實現(xiàn)兼容性檢測詳解
這篇文章主要給大家介紹了關于Three.js利用Detector.js插件如何實現(xiàn)兼容性檢測的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。2017-09-09
JavaScript實現(xiàn)異步獲取表單數(shù)據(jù)
這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)異步獲取表單數(shù)據(jù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-05-05

