最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

async/await優(yōu)雅的錯誤處理方法總結

 更新時間:2019年01月30日 16:51:45   作者:Vincent.W  
這篇文章主要給大家介紹了關于async/await優(yōu)雅的錯誤處理方法的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

node.js的世界,從callback開始,不會止于async.

本文將給大家詳細介紹關于async/await優(yōu)雅的錯誤處理的相關內容,下面話不多說了,來一起看看詳細的介紹吧

async/await優(yōu)雅的錯誤處理

一般情況下 async/await 在錯誤處理方面,主要使用 try/catch,像這樣

const fetchData = () => {
 return new Promise((resolve, reject) => {
  setTimeout(() => {
   resolve('fetch data is me')
  }, 1000)
 })
}

(async () => {
 try {
  const data = await fetchData()
  console.log('data is ->', data)
 } catch(err) {
  console.log('err is ->', err)
 }
})()

這么看,感覺倒是沒什么問題,如果是這樣呢?有多個異步操作,需要對每個異步返回的 error 錯誤狀態(tài)進行不同的處理,以下是示例代碼

const fetchDataA = () => {
 return new Promise((resolve, reject) => {
  setTimeout(() => {
   resolve('fetch data is A')
  }, 1000)
 })
}

const fetchDataB = () => {
 return new Promise((resolve, reject) => {
  setTimeout(() => {
   resolve('fetch data is B')
  }, 1000)
 })
}

const fetchDataC = () => {
 return new Promise((resolve, reject) => {
  setTimeout(() => {
   resolve('fetch data is C')
  }, 1000)
 })
}

(async () => {
 try {
  const dataA = await fetchDataA()
  console.log('dataA is ->', dataA)
 } catch(err) {
  console.log('err is ->', err)
 }

 try {
  const dataB = await fetchDataB()
  console.log('dataB is ->', dataB)
 } catch(err) {
  console.log('err is ->', err)
 }

 try {
  const dataC = await fetchDataC()
  console.log('dataC is ->', dataC)
 } catch(err) {
  console.log('err is ->', err)
 }
})()

這樣寫代碼里充斥著 try/catch,有代碼潔癖的你能忍受的了嗎?這時可能會想到只用一個 try/catch。

// ... 這里 fetch 函數(shù)省略

(async () => {
 try {
  const dataA = await fetchDataA()
  console.log('dataA is ->', dataA)
  const dataB = await fetchDataB()
  console.log('dataB is ->', dataB)
  const dataC = await fetchDataC()
  console.log('dataC is ->', dataC)
 } catch(err) {
  console.log('err is ->', err)
  // 難道要定義 err 類型,然后判斷嗎??
  /**
   * if (err.type === 'dataA') {
   * console.log('dataA err is', err)
   * }
   * ......
   * */
 }
})()

如果是這樣寫只會增加編碼的復雜度,而且要多寫代碼,這個時候就應該想想怎么優(yōu)雅的解決,async/await 本質就是 promise 的語法糖,既然是 promise 那么就可以使用 then 函數(shù)了

(async () => {
 const fetchData = () => {
  return new Promise((resolve, reject) => {
   setTimeout(() => {
    resolve('fetch data is me')
   }, 1000)
  })
 }

 const data = await fetchData().then(data => data ).catch(err => err)
 console.log(data)
})()

在上面寫法中,如果 fetchData 返回 resolve 正確結果時,data 是我們要的結果,如果是 reject 了,發(fā)生錯誤了,那么 data 是錯誤結果,這顯然是行不通的,再對其完善。

(async () => {
 const fetchData = () => {
  return new Promise((resolve, reject) => {
   setTimeout(() => {
    resolve('fetch data is me')
   }, 1000)
  })
 }

 const [err, data] = await fetchData().then(data => [null, data] ).catch(err => [err, null])
 console.log('err', err)
 console.log('data', data)
 // err null
 // data fetch data is me
})()

這樣是不是好很多了呢,但是問題又來了,不能每個 await 都寫這么長,寫著也不方便也不優(yōu)雅,再優(yōu)化一下

(async () => {
 const fetchData = () => {
  return new Promise((resolve, reject) => {
   setTimeout(() => {
    resolve('fetch data is me')
   }, 1000)
  })
 }

 // 抽離成公共方法
 const awaitWrap = (promise) => {
  return promise
   .then(data => [null, data])
   .catch(err => [err, null])
 }

 const [err, data] = await awaitWrap(fetchData())
 console.log('err', err)
 console.log('data', data)
 // err null
 // data fetch data is me
})()

將對 await 處理的方法抽離成公共的方法,在使用 await 調用 awaitWrap 這樣的方法是不是更優(yōu)雅了呢。如果使用 typescript 實現(xiàn)大概是這個樣子

function awaitWrap<T, U = any>(promise: Promise<T>): Promise<[U | null, T | null]> {
 return promise
  .then<[null, T]>((data: T) => [null, data])
  .catch<[U, null]>(err => [err, null])
}

以上。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • Node.js使用cookie保持登錄的方法

    Node.js使用cookie保持登錄的方法

    本篇文章主要介紹了Node.js使用cookie保持登錄的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 利用node.js如何搭建一個簡易的即時響應服務器

    利用node.js如何搭建一個簡易的即時響應服務器

    這篇文章主要介紹了利用node.js如何搭建一個簡易的即時響應服務器的相關資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。
    2017-05-05
  • nodejs清空/刪除指定文件夾下面所有文件或文件夾的方法示例

    nodejs清空/刪除指定文件夾下面所有文件或文件夾的方法示例

    這篇文章主要介紹了nodejs清空/刪除指定文件夾下面所有文件或文件夾的方法,通過兩個具體案例形式分析了node.js同步刪除文件/文件夾,以及異步刪除文件/文件夾的相關實現(xiàn)技巧,涉及遞歸遍歷與文件判斷、回調等相關操作,需要的朋友可以參考下
    2023-04-04
  • nvm查看所有node包命令失效原因解決方案

    nvm查看所有node包命令失效原因解決方案

    使用nvm時可能會遇到超時問題,這是由于node的包存放在國外服務器上,解決方法是在nvm的配置文件中添加鏡像地址,下面就來具體介紹一下步驟,感興趣的可以了解一下
    2024-09-09
  • nodejs中簡單實現(xiàn)Javascript Promise機制的實例

    nodejs中簡單實現(xiàn)Javascript Promise機制的實例

    這篇文章主要介紹了nodejs中簡單實現(xiàn)Javascript Promise機制的實例,本文在nodejs中簡單實現(xiàn)一個promise/A 規(guī)范,需要的朋友可以參考下
    2014-12-12
  • Node.js模塊封裝及使用方法

    Node.js模塊封裝及使用方法

    這篇文章主要為大家詳細介紹了Node.js模塊封裝及使用方法,感興趣的朋友可以參考一下
    2016-03-03
  • Nodejs 中的 Buffer 類的創(chuàng)建與基本使用

    Nodejs 中的 Buffer 類的創(chuàng)建與基本使用

    這篇文章主要為大家介紹了Nodejs中Buffer的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Node.js如何通過http調用外部接口

    Node.js如何通過http調用外部接口

    這篇文章主要介紹了Node.js如何通過http調用外部接口問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • node如何將package.json中的包降為低版本或者升級為高版本

    node如何將package.json中的包降為低版本或者升級為高版本

    比如現(xiàn)在你用某個包的當前版本,但是你安裝的版本高了,那么你應該這么做,首先刪除node項目中的node_modules目錄,防止安裝時的包不一致,下面給大家介紹node將package.json中的包降為低版本或者升級為高版本的方法,感興趣的朋友一起看看吧
    2023-11-11
  • Node.js安裝詳細步驟教程(Windows版)詳解

    Node.js安裝詳細步驟教程(Windows版)詳解

    這篇文章主要介紹了Node.js安裝詳細步驟教程(Windows版),本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09

最新評論

资溪县| 淄博市| 夏津县| 长白| 通城县| 呈贡县| 铜鼓县| 河池市| 五峰| 台江县| 武鸣县| 灵川县| 郸城县| 南昌县| 铜山县| 巴林左旗| 南和县| SHOW| 哈巴河县| 临漳县| 屏山县| 池州市| 五峰| 重庆市| 宜宾县| 舒城县| 准格尔旗| 龙里县| 吉林市| 宁晋县| 博兴县| 宜兰市| 田东县| 英超| 黄山市| 商洛市| 营口市| 太康县| 临洮县| 辰溪县| 平乡县|