async/await其實是Generator 的語法糖,它能實現的效果都能用then鏈來實現,它是為優化then鏈而開發出來的。從字面上來看,async是“異步”的簡寫,await則為等待,所以很好理解async 用于申明一個 function 是異步的,而 await 用于等待一個異步方法執行完成。當然語法上強制規定await只能出現在asnyc函數中,先來看看async函數返回了什么:
所以,async 函數返回的是一個 Promise 對象。async 函數(包含函數語句、函數表達式、Lambda表達式)會返回一個 Promise 對象,如果在函數中 return 一個直接量,async 會把這個直接量通過 Promise.resolve() 封裝成 Promise 對象。
async 函數返回的是一個 Promise 對象,所以在最外層不能用 await 獲取其返回值的情況下,當然應該用原來的方式:then() 鏈來處理這個 Promise 對象,就像這樣:
那如果 async 函數沒有返回值,又該如何?很容易想到,它會返回 Promise.resolve(undefined)。
聯想一下 Promise 的特點——無等待,所以在沒有 await 的情況下執行 async 函數,它會立即執行,返回一個 Promise 對象,并且,絕不會阻塞后面的語句。這和普通返回 Promise 對象的函數并無二致。
注意:Promise.resolve(x) 可以看作是 new Promise(resolve => resolve(x)) 的簡寫,可以用于快速封裝字面量對象或其他對象,將其封裝成 Promise 實例。