国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

async/await優雅的錯誤處理方法總結

2019-11-19 12:11:34
字體:
來源:轉載
供稿:網友

前言

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

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

async/await優雅的錯誤處理

一般情況下 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 錯誤狀態進行不同的處理,以下是示例代碼

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 函數省略(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)   * }   * ......   * */ }})()

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

(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 了,發生錯誤了,那么 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 都寫這么長,寫著也不方便也不優雅,再優化一下

(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 這樣的方法是不是更優雅了呢。如果使用 typescript 實現大概是這個樣子

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

以上。

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 房产| 迁西县| 鲁山县| 陆良县| 洛隆县| 祁门县| 蒲城县| 田阳县| 巩义市| 广河县| 罗田县| 高邑县| 津南区| 五大连池市| 绥滨县| 广平县| 社会| 柳江县| 垫江县| 高要市| 福建省| 观塘区| 丹棱县| 尼勒克县| 吴堡县| 阿荣旗| 钟祥市| 磐安县| 仪陇县| 精河县| 林甸县| 遂溪县| 宁南县| 呼图壁县| 正定县| 汕尾市| 维西| 建宁县| 广州市| 博客| 石台县|