Learn async/await

JavaScript的異步處理方案由最初讓人頭疼的callback hell,到ES6加入了抽象異步處理對象的Promise,在思想上已經(jīng)有了質(zhì)的飛躍,后來出現(xiàn)的Generator Function改成了趨向于同步的寫法,使用yield標記異步操作中需要暫停的地方,通過next()移動指針等等,但這樣做語義不太直觀,到最后終于出現(xiàn)了一種被稱為終極解決方案的方案,加入了ES7中,它就是async/await。

async/await本質(zhì)上是在操作Promise,所以還是異步

const sleep = time =>
  new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('ok')
    }, time)
  })

async function start() {
  let result = await sleep(3000)
  console.log(result)
}

start()
?
// async函數(shù)返回一個Promise對象
start()
  .then(() => {
    console.log('hello')
  })

await后面的Promise對象,如果需要捕捉異常(運行結果是rejected)有如下兩種寫法:

const sleep = time =>
  new Promise((resolve, reject) => {
    setTimeout(() => {
      reject('error')
    }, time)
  })

// .catch 捕捉
async function start() {
  let result = await sleep(3000).catch(err => {
    console.error(err)
  })
}

// try/catch 語句
async function start() {
  try {
    let result = await sleep(3000)
    console.log(result)
  } catch (err) {
    console.error(err)
  }
}

異步循環(huán)

async function start() {
  for (let i = 0; i < 5; i++) {
    console.log(i)
    await sleep(1000)
  }
}

注意,await 只能在 async 函數(shù)中,如果用在普通函數(shù)(如forEach)中會報錯。

如果需要多個請求并發(fā)執(zhí)行,可以使用Promise.all(),用法詳見上一篇文章。

async function concurrency() {
  await Promise.all(promises)
}

此外,有一篇文章介紹了一些錯誤處理和動態(tài)運算的解決方案,可以學習一下

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 異步編程對JavaScript語言太重要。Javascript語言的執(zhí)行環(huán)境是“單線程”的,如果沒有異步編程,根本...
    呼呼哥閱讀 7,400評論 5 22
  • 相對于回調(diào)函數(shù)來說,Promise是一種相對優(yōu)雅的選擇。那么有沒有更好的方案呢?答案就是async/await。優(yōu)...
    松哥888閱讀 47,844評論 8 36
  • 簡單介紹下這幾個的關系為方便起見 用以下代碼為例簡單介紹下這幾個東西的關系, async 在函數(shù)聲明前使用asyn...
    _我和你一樣閱讀 21,482評論 1 24
  • 弄懂js異步 講異步之前,我們必須掌握一個基礎知識-event-loop。 我們知道JavaScript的一大特點...
    DCbryant閱讀 2,869評論 0 5
  • 國慶八天就是起床吃飯打游戲看劇,看不下打游戲手麻休息一下接著打,反省覺著這樣太浪費時間不如寫作畫畫雕刻,但是下一秒...
    阿諾藍閱讀 200評論 0 0

友情鏈接更多精彩內(nèi)容