簡(jiǎn)介
使用async/await可以方便處理js中的異步情況,這是ES2017提出來(lái)的一對(duì)很好用的操作符。
async
函數(shù)開頭加的一個(gè)關(guān)鍵字, 返回一個(gè)promise對(duì)象,如果函數(shù)直接返回一個(gè)值,則會(huì)用promise.resolve()包裹起來(lái)。
async function demo() {
return 'demo';
}
demo().then((data) => {
console.log(data);
})
await
await 意思是等待,等待的是一個(gè)表達(dá)式,可以是常量,變量,promise,函數(shù)等。
function demo1() {
return 'demo1';
}
const demo2 = 'demo2';
async function test() {
const a = await demo();
const b = await demo1();
const c = await demo2;
console.log(`a:${a},b:$,c:${c}`);
}
test();
解惑
問(wèn)題1:await關(guān)鍵字只能在async函數(shù)中用嗎?
答:是的,await等待的是一個(gè)返回的結(jié)果,同步情況下,直接返回,異步情況下await會(huì)阻塞執(zhí)行流程,直到結(jié)果返回,才會(huì)繼續(xù)下面的代碼。阻塞代碼是意見(jiàn)很可怕的事,而async函數(shù),返回的是一個(gè)promise對(duì)象,異步執(zhí)行,所以await只能在async函數(shù)中使用,如果正常程序中使用,會(huì)造成整個(gè)程序阻塞,得不償失。問(wèn)題2:await只會(huì)等待一個(gè)結(jié)果,那么發(fā)生錯(cuò)誤了該如何處理?
答:我們知道promise返回的不僅僅只有resolve,還有一個(gè)reject的情況,所以我們可以用以下情況去處理錯(cuò)誤:
- 用try-catch
async function tryCatch() {
try {
await Promise.reject('tryCath');
} catch(err) {
console.log(err);
}
}
tryCatch();
- 用promise的catch
async function tryCatch1() {
await Promise.reject('tryCath1').catch((err) => {
console.log(err);
});
}
tryCatch1();
- 問(wèn)題3:async/await和promise哪個(gè)好?
答:個(gè)人覺(jué)得async/await比promise好多了,理由如下:
(1)簡(jiǎn)潔,不需要寫.then,也不需要定義多余的結(jié)果變量,避免嵌套
(2)可以同時(shí)處理同步和異步錯(cuò)誤,在promise中,try/catch不能處理JSON.parse的錯(cuò)誤,因?yàn)樵趐romise中,我們需要使用.catch,代碼非常冗余
(3)對(duì)于一些條件判斷,數(shù)據(jù)可以直接返回進(jìn)行比較,避免嵌套,更加直觀
(4)調(diào)試方便