ES6學習筆記(四)—— async 函數
阿新 • • 發佈:2017-09-08
ons fst cte code span pre getname 普通 聲明
await 是 async wait 的簡寫, 是 generator 函數的語法糖。
async 函數的特點:
- async 聲明一個方法是異步的,await 則等待這個異步方法執行的完成
asyncReadFile = async function () { var f1 = await readFile(‘/etc/fstab‘) var f2 = await readFile(‘/etc/shells‘) console.log(f1.toString()) console.log(f2.toString()) }
- await 只能出現在 async 函數中, 用在 async 外或者普通函數內都會報錯
function getDay () { return new Date().getDay() } const today = await getDay () // Uncaught SyntaxError: Unexpected identifier
- async函數返回一個 Promise 對象,如果在函數中 return 一個直接量,async 會把這個直接量通過 Promise.resolve() 封裝成 Promise 對象
async function getName () { return ‘wangxi‘ } getName()// Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "wangxi"}
- async函數內部return語句返回的值,會成為then方法回調函數的參數
async function getName () { return ‘wangxi‘ } getName().then(value => console.log(value)) // wangxi
- 只要一個
await
語句後面的 Promise 變為reject
,那麽整個async
函數都會中斷執行
async function f() {await Promise.reject(‘出錯了‘) await Promise.resolve(‘hello world‘) // 不會執行 } f() // VM259:4 Uncaught (in promise) 出錯了
- 如果希望前一個異步操作失敗但不會影響後面的異步操作繼續進行,可以將前面的 await 放在 try...catch 結構裏面(如果有多個 await ,則需要將每一個 await 都放在 try...catch 中)
async function f() { try { await Promise.reject(‘出錯了‘) } catch(e) { } return await Promise.resolve(‘hello world‘) } f().then(v => console.log(v))
或者在 await 後面的 Promise 對象加一個 catch 方法來處理錯誤
async function f() { await Promise.reject(‘出錯了‘).catch(e => console.log(e)) await Promise.reject(‘又出錯了‘).catch(e => console.log(e)) return await Promise.resolve(‘hello world‘) } f().then(v => console.log(v)) // 出錯了 // 又出錯了 // hello world
- 如果多個異步操作不存在繼發關系,則可以使用 Promise.all 同時觸發異步操作
async function f () { // 先後,先執行 getName() 再執行 getAge() const name = await getName() const age = await getAge() console.log(name, wangxi) // wangxi 25 // 同時觸發 let [name1, age1] = await Promise.all([getName(), getAge()]) console.log(name1, age1) // wangxi 25 }
ES6學習筆記(四)—— async 函數