1、async
函數返回一個 Promise 對象。
async
函數內部return
語句返回的值,會成為then
方法回調函數的參數。
async function f() { return 'hello world'; } f().then(v => console.log(v)) // "hello world"
2、async
函數內部拋出錯誤,會導致返回的 Promise 對象變為reject
狀態。拋出的錯誤對象會被catch
方法回調函數接收到。
async function f() { throw new Error('出錯了'); } f().then( v => console.log(v), e => console.log(e) ) // Error: 出錯了
3、只有async
函數內部的異步操作執行完,才會執行then
方法指定的回調函數。
async function getTitle(url) { let response = await fetch(url); let html = await response.text(); return html.match(/<title>([\s\S]+)<\/title>/i)[1]; } getTitle('https://tc39.github.io/ecma262/').then(console.log) // "ECMAScript 2017 Language Specification"
上面代碼中,函數getTitle
內部有三個操作:抓取網頁、取出文本、匹配頁面標題。只有這三個操作全部完成,才會執行then
方法里面的console.log
。
4、正常情況下,await
命令后面是一個 Promise 對象。如果不是,會被轉成一個立即resolve
的 Promise 對象。
async function f() { return await 123; } f().then(v => console.log(v)) // 123
上面代碼中,await
命令的參數是數值123
,它被轉成 Promise 對象,並立即resolve
。
只要一個await
語句后面的 Promise 變為reject
,那么整個async
函數都會中斷執行。
5、有時,我們希望即使前一個異步操作失敗,也不要中斷后面的異步操作。這時可以將第一個await
放在try...catch
結構里面,這樣不管這個異步操作是否成功,第二個await
都會執行。