<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網 責編:小采 時間:2020-11-27 22:01:24
        文檔

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

        async/await優雅的錯誤處理方法總結:前言 node.js的世界,從callback開始,不會止于async. 本文將給大家詳細介紹關于async/await優雅的錯誤處理的相關內容,下面話不多說了,來一起看看詳細的介紹吧 async/await優雅的錯誤處理 一般情況下 async/await 在錯誤處理方面,主要使用 tr
        推薦度:
        導讀async/await優雅的錯誤處理方法總結:前言 node.js的世界,從callback開始,不會止于async. 本文將給大家詳細介紹關于async/await優雅的錯誤處理的相關內容,下面話不多說了,來一起看看詳細的介紹吧 async/await優雅的錯誤處理 一般情況下 async/await 在錯誤處理方面,主要使用 tr

        前言

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

        以上。

        總結

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        async/await優雅的錯誤處理方法總結:前言 node.js的世界,從callback開始,不會止于async. 本文將給大家詳細介紹關于async/await優雅的錯誤處理的相關內容,下面話不多說了,來一起看看詳細的介紹吧 async/await優雅的錯誤處理 一般情況下 async/await 在錯誤處理方面,主要使用 tr
        推薦度:
        標簽: 處理 優雅 async
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 女人被男人桶得好爽免费视频| 无码日韩精品一区二区免费暖暖| 桃子视频在线观看高清免费完整| 亚洲精品福利视频| 久久综合国产乱子伦精品免费| 亚洲国产精品无码久久SM| 久久福利青草精品资源站免费 | 亚洲一区二区影院| 香蕉高清免费永久在线视频| 亚洲日韩av无码中文| 日韩在线a视频免费播放| 亚洲日韩区在线电影| **一级一级毛片免费观看| 亚洲国产精品久久人人爱| 黄页网站在线看免费| 亚洲AV无码专区在线电影成人| 亚洲 另类 无码 在线| a成人毛片免费观看| 无遮免费网站在线入口| 亚洲成av人片在www鸭子| 男人的天堂亚洲一区二区三区| 永久免费无码网站在线观看个| 亚洲一区二区三区香蕉| 国产区图片区小说区亚洲区| 亚洲福利在线播放| 国偷自产一区二区免费视频| 亚洲一级毛片免费在线观看| 国产成人精品123区免费视频| eeuss免费影院| 亚洲系列中文字幕| 全部免费毛片在线| 一个人免费视频观看在线www| 亚洲av无码电影网| 亚洲精品无码你懂的网站| 精品久久久久久久久亚洲偷窥女厕| 亚洲日本在线观看视频| **俄罗斯毛片免费| 一区二区三区免费视频观看| 亚洲视频小说图片| 亚洲精品国产日韩无码AV永久免费网| 一级毛片在线观看免费|