欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

node.js的世界,從callback開(kāi)始,不會(huì)止于async.

本文將給大家詳細(xì)介紹關(guān)于async/await優(yōu)雅的錯(cuò)誤處理的相關(guān)內(nèi)容,下面話(huà)不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧

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

一般情況下 async/await 在錯(cuò)誤處理方面,主要使用 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)
 }
})()

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

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)
 }
})()

這樣寫(xiě)代碼里充斥著 try/catch,有代碼潔癖的你能忍受的了嗎?這時(shí)可能會(huì)想到只用一個(gè) 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 類(lèi)型,然后判斷嗎??
  /**
   * if (err.type === 'dataA') {
   * console.log('dataA err is', err)
   * }
   * ......
   * */
 }
})()

如果是這樣寫(xiě)只會(huì)增加編碼的復(fù)雜度,而且要多寫(xiě)代碼,這個(gè)時(shí)候就應(yīng)該想想怎么優(yōu)雅的解決,async/await 本質(zhì)就是 promise 的語(yǔ)法糖,既然是 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)
})()

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

(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
})()

這樣是不是好很多了呢,但是問(wèn)題又來(lái)了,不能每個(gè) await 都寫(xiě)這么長(zhǎng),寫(xiě)著也不方便也不優(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
})()

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

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])
}

以上。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 了不起的node.js讀書(shū)筆記之例程分析

    了不起的node.js讀書(shū)筆記之例程分析

    這篇文章主要介紹了了不起的node.js讀書(shū)筆記之例程分析,需要的朋友可以參考下
    2014-12-12
  • 詳解nodejs內(nèi)置模塊

    詳解nodejs內(nèi)置模塊

    這篇文章主要介紹了nodejs內(nèi)置模塊,對(duì)nodejs感興趣的同學(xué),可以參考下
    2021-05-05
  • node.js文件的壓縮解壓?jiǎn)栴}

    node.js文件的壓縮解壓?jiǎn)栴}

    這篇文章主要介紹了node.js文件的壓縮解壓?jiǎn)栴},具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • pnpm的安裝和使用指南(推薦!)

    pnpm的安裝和使用指南(推薦!)

    如果你覺(jué)得npm比較慢,又不想用yarn,那么pnpm是一個(gè)很好的選擇,下面這篇文章主要給大家介紹了關(guān)于pnpm的安裝和使用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • node.js結(jié)合webSocket實(shí)現(xiàn)聊天室

    node.js結(jié)合webSocket實(shí)現(xiàn)聊天室

    于Node.js和WebSocket的聊天室,主要包括前端頁(yè)面,主要是用戶(hù)操作的頁(yè)面,還包括后臺(tái)數(shù)據(jù)通信以及邏輯處理,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • Node.js高級(jí)編程之UDP可靠性分析

    Node.js高級(jí)編程之UDP可靠性分析

    這篇文章主要為大家介紹了Node.js高級(jí)編程之UDP可靠性分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 詳解如何在NodeJS應(yīng)用程序中處理多個(gè)API請(qǐng)求

    詳解如何在NodeJS應(yīng)用程序中處理多個(gè)API請(qǐng)求

    NodeJS默認(rèn)是異步的,這意味著它已經(jīng)能夠同時(shí)處理多個(gè)請(qǐng)求,但它只適用于I/O操作,如HTTP請(qǐng)求、文件系統(tǒng)操作、數(shù)據(jù)庫(kù)查詢(xún)、實(shí)時(shí)聊天應(yīng)用等,在處理CPU密集型任務(wù)時(shí),可能需要很長(zhǎng)時(shí)間,這就是為什么NodeJS提供了一些我們將在下面介紹的特定包
    2023-12-12
  • 淺談HTTP 緩存的那些事兒

    淺談HTTP 緩存的那些事兒

    HTTP 緩存機(jī)制作為 Web 應(yīng)用性能優(yōu)化的重要手段,是想要成為前端架構(gòu)的必備技能。這篇文章主要介紹了淺談HTTP 緩存并用node實(shí)現(xiàn)緩存,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-10-10
  • node.js適合游戲后臺(tái)開(kāi)發(fā)嗎?

    node.js適合游戲后臺(tái)開(kāi)發(fā)嗎?

    這篇文章主要介紹了node.js適合游戲后臺(tái)開(kāi)發(fā)嗎?node.js是不是能代替C++開(kāi)發(fā)游戲后臺(tái)呢?看完本文我想你會(huì)有一定的了解了,需要的朋友可以參考下
    2014-09-09
  • node.js中的console.time方法使用說(shuō)明

    node.js中的console.time方法使用說(shuō)明

    這篇文章主要介紹了node.js中的console.time方法使用說(shuō)明,本文介紹了console.time的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12

最新評(píng)論