1. 程式人生 > >ES6學習筆記(四)—— async 函數

ES6學習筆記(四)—— async 函數

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 函數