<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
        主站蜘蛛池模板: 亚洲中文字幕无码中文字在线| 成年美女黄网站色大免费视频| 亚洲精品tv久久久久| 亚洲第一综合天堂另类专| 四虎永久在线观看免费网站网址 | 亚洲热妇无码AV在线播放| 少妇亚洲免费精品| 亚洲色婷婷综合开心网| 一级日本高清视频免费观看 | 亚洲午夜国产精品无码| a高清免费毛片久久| 国产亚洲大尺度无码无码专线| 永久免费无码网站在线观看个| 亚洲中文字幕无码不卡电影| 国产免费区在线观看十分钟| 亚洲人成网77777色在线播放| 日韩免费观看一区| 亚洲视频免费在线播放| 青青草免费在线视频| 亚洲av中文无码字幕色不卡| 免费在线黄色网址| a毛片在线免费观看| 精品亚洲成AV人在线观看| 24小时免费直播在线观看| 美女无遮挡免费视频网站| 国产精品亚洲mnbav网站| 一个人免费日韩不卡视频| 亚洲国产精品综合久久20| 在线观看免费国产视频| 中文字幕无码免费久久9一区9| 亚洲av日韩av无码黑人| 毛片a级三毛片免费播放| 国产AV日韩A∨亚洲AV电影| 国产精品亚洲аv无码播放| 日本视频一区在线观看免费| 亚洲国产综合AV在线观看| 最新精品亚洲成a人在线观看| 91禁漫免费进入| 美女羞羞视频免费网站| 91在线亚洲精品专区| 免费真实播放国产乱子伦|