簡介
使用async/await可以方便處理js中的異步情況爆哑,這是ES2017提出來的一對很好用的操作符洞难。
async
函數(shù)開頭加的一個關(guān)鍵字, 返回一個promise對象,如果函數(shù)直接返回一個值揭朝,則會用promise.resolve()包裹起來队贱。
async function demo() {
return 'demo';
}
demo().then((data) => {
console.log(data);
})
await
await 意思是等待,等待的是一個表達式潭袱,可以是常量柱嫌,變量,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();
解惑
問題1:await關(guān)鍵字只能在async函數(shù)中用嗎?
答:是的趟径,await等待的是一個返回的結(jié)果瘪吏,同步情況下,直接返回蜗巧,異步情況下await會阻塞執(zhí)行流程掌眠,直到結(jié)果返回,才會繼續(xù)下面的代碼幕屹。阻塞代碼是意見很可怕的事蓝丙,而async函數(shù),返回的是一個promise對象望拖,異步執(zhí)行渺尘,所以await只能在async函數(shù)中使用,如果正常程序中使用说敏,會造成整個程序阻塞鸥跟,得不償失。問題2:await只會等待一個結(jié)果,那么發(fā)生錯誤了該如何處理医咨?
答:我們知道promise返回的不僅僅只有resolve,還有一個reject的情況枫匾,所以我們可以用以下情況去處理錯誤:
- 用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();
- 問題3:async/await和promise哪個好?
答:個人覺得async/await比promise好多了拟淮,理由如下:
(1)簡潔干茉,不需要寫.then,也不需要定義多余的結(jié)果變量很泊,避免嵌套
(2)可以同時處理同步和異步錯誤角虫,在promise中,try/catch不能處理JSON.parse的錯誤委造,因為在promise中上遥,我們需要使用.catch,代碼非常冗余
(3)對于一些條件判斷争涌,數(shù)據(jù)可以直接返回進行比較粉楚,避免嵌套,更加直觀
(4)調(diào)試方便