async關(guān)鍵字
在ES6中庄呈,聲明異步函數(shù)很簡(jiǎn)單宙项,只需要在function前加上async關(guān)鍵字即可娃属,如下:
async function helloWorld() {
// todo
return 'hello world'
}
那怎么調(diào)用呢?async 函數(shù)也是函數(shù)蛉顽,平時(shí)我們?cè)趺词褂煤瘮?shù)就怎么使用它蝗砾,直接加括號(hào)調(diào)用就可以了,為了表示它沒(méi)有阻塞它后面代碼的執(zhí)行携冤,我們?cè)赼sync 函數(shù)調(diào)用之后加一句console.log;
async function helloWorld() {
return 'hello world'
}
helloWorld();
console.log('雖然在后面悼粮,但是我先執(zhí)行');
async 函數(shù) helloWorld調(diào)用了,但是沒(méi)有任何輸出噪叙,它不是應(yīng)該返回 'hello world'嗎矮锈? 先不要著急, 看一看helloWorld()執(zhí)行返回了什么睁蕾? 把上面的 helloWorld() 語(yǔ)句改為console.log(helloWorld()):
async function helloWorld() {
return 'hello world'
}
console.log(helloWorld());
console.log('雖然在后面苞笨,但是我先執(zhí)行');
可以看出,async 函數(shù)返回的是一個(gè)promise 對(duì)象子眶,如果要獲取到promise 返回值瀑凝,我們應(yīng)該用then 方法:
async function helloWorld() {
return 'hello world'
}
helloWorld().then(result => {
console.log(result);
})
console.log('雖然在后面,但是我先執(zhí)行');
我們獲取到了"hello world', 同時(shí)helloWorld的執(zhí)行也沒(méi)有阻塞后面代碼的執(zhí)行臭杰,和說(shuō)的一致粤咪。
這時(shí),控制臺(tái)中的Promise有一個(gè)resolved渴杆,這是async 函數(shù)內(nèi)部的實(shí)現(xiàn)原理寥枝。如果async 函數(shù)中有返回一個(gè)值 ,當(dāng)調(diào)用該函數(shù)時(shí),內(nèi)部會(huì)調(diào)用Promise.resolve() 方法把它轉(zhuǎn)化成一個(gè)promise 對(duì)象作為返回磁奖,但如果helloWorld函數(shù)內(nèi)部拋出錯(cuò)誤呢囊拜? 那么就會(huì)調(diào)用Promise.reject() 返回一個(gè)promise 對(duì)象, 這時(shí)修改一下helloWorld函數(shù):
async function helloWorld(bool) {
if (bool) {
return 'hello world'
} else {
throw 'error'
}
}
console.log(helloWorld(true)) // 調(diào)用Promise.resolve() 返回promise 對(duì)象比搭。
console.log(helloWorld(false)); // 調(diào)用Promise.reject() 返回promise 對(duì)象冠跷。
如果函數(shù)內(nèi)部拋出錯(cuò)誤, promise 對(duì)象有一個(gè)catch 方法進(jìn)行捕獲:
helloWorld(false).catch(err => {
console.log(err)
})