Async函數是ES2017引入的,這一引入使得異步操做又更加方便了。其實async函數是generator的語法糖。只是把*號變成async,yield變成await。promise
Async函數返回一個promise對象,能夠用then去添加回調函數,函數內部的return值,會成爲then方法的回調參數:異步
async function fn() {async
return 'a';函數
}測試
fn().then(res => {cdn
console.log(res);//a對象
})ip
若是報錯,會被promise的catch捕獲。並且async函數返回的必定要內部全部await後面的promise對象執行完纔會發生狀態改變,除非遇到return或報錯:generator
var pro1 = new Promise((resolve, reject) => {回調函數
setTimeout(() => {resolve('pro1')}, 1000);
})
var pro2 = new Promise((resolve, reject) => {
setTimeout(() => {resolve('pro2')}, 2000);
})
async function fn() {
let p1 = await pro1;
console.log(p1);//pro1
let p2 = await pro2;
console.log(p2);//pro2
return 'end';
}
fn().then(res => {
console.log(res);//end
})
會在pro1和pro2執行完畢以後輸出end。能夠隨便測試一些報錯,修改時間等去理解。
Await在正常狀況下跟一個promise對象,若是不是,則直接返回該對象的結果,若是是thenable對象也等同於promise對象。若是await後面的promise對象有reject狀態,則reject會被catch捕獲,與return同樣,直接終止async函數。若是不想中斷,則須要把await放到try catch裏面,或者後面的promise對象跟一個catch方法。
阮大神花了很長的篇幅去講解了錯誤的處理和怎麼處理兩個獨立的異步操做,我的以爲能夠去了解,可是會以爲既然使用了async,最好是異步且有順序關係的。若是不是這樣的,那麼能夠直接普通方法執行。
以前也分享過async和await,這邊仍是要提一嘴,async的效率會高於promise,async的耗時是最長那個的耗時,promise是全部的和。
關於async更多的一些內容仍是去看ECMAScript6入門,裏面還有一些我的以爲要了解可是不是特別重要的內容。