await?Streaking解決原理示例詳解
前言
我們現(xiàn)在在請求接口的過程中,已經(jīng)習慣了async/await
的寫法,已經(jīng)逐漸的代替了promise
的寫法,但我們在開發(fā)的過程中,都是混用的狀態(tài),當你體驗async/await
過的好,就會愛不釋手。
async/await
我們要拒絕 Streaking,啥叫 Streaking,我們看個代碼。
const foo = async () => { const response = await axios.get('https://www.baidu.com') console.log(response); } foo()
一旦失敗我們控制臺就會出現(xiàn)報錯,一個接口就是一個紅色的。
此時,你想起我們還有try...catch...
,可你知道嗎?try...catch...
并不是萬能的,有時候他捕獲不到異步的錯誤,再有就是每個async/await
你都加一個try...catch...
,一個項目中,并可能只出現(xiàn)一個借口調用的地方吧,每個都加,就請問你累不累??。
const foo = async () => { try{ const response = await axios.get('https://www.baidu.com') console.log(response); } catch (error) { console.log(error) } } foo()
優(yōu)化async/await
經(jīng)過上面一說,那我還不如用回promise
。當你看到一長串的.then
的時候你好維護嗎?不煩嗎?
那你說我們應該怎么辦?我們需要從源頭入手。
我們現(xiàn)在都會先基于axios/fetch
進行二次封裝對不?有時候我們還會三次封裝對吧?這個封裝就是我們的源頭。
我們先看個promise
的封裝。
// 封裝 const request = (option = {}) =>{ return new Promise((resolve, reject) => { axios.get(option.url).then( response => { resolve(response) }).catch( error => { reject(error) }); }) } // 調用 const foo = async () => { const response = await request({ url: './demo.json' }) console.log(response); } foo()
常見的封裝就長上面這樣,這樣除了方便傳參數(shù),和沒封有啥區(qū)別?
我的答案是沒區(qū)別,那我們應該怎么來封裝呢?
看下面的代碼:
// 封裝 const request = async (option = {}) => { const result = [null, null] await new Promise((resolve, reject) => { axios.get(option.url).then( response => { result[0] = response resolve(response) }).catch( error => { result[1] = error resolve(error) }); }) return result } // 調用 const foo = async () => { const [response, error] = await request({ url: './demo.json' }) console.log(response, error); } foo()
此時此刻,看到上面的封裝,有朋友就有疑問了,那么怎么判斷呢?
我們可以通過if()
來判斷呀,數(shù)組第一個為成功,第二個為失敗,默認值都是null
,我們只需要判斷不等于null
就可以了呀。像下面這樣。
// 判斷請求成功 if(response !== null){ console.log('請求成功內容:-----'); console.log(response.data.data); return }
失敗的話判斷,同理。
// 判斷請求失敗 if(error !== null){ console.log('請求失敗內容:-----'); console.log(error); return }
但我更喜歡像下面這樣寫。
// 調用 const foo = async () => { const [response, error] = await request({ url: './demo1.json' }) // 判斷請求成功 if(response !== null){ console.log('請求成功內容:-----'); console.log(response.data.data); return } // 判斷請求失敗 console.log('請求失敗內容:-----'); console.log(error); ... }
demo.json
下面為demo.json
的內容。
{ "code": 200, "data": { "name": "桃小瑞" } }
關于Promise
關于Promise
的詳細說明及原理,以及手寫一款Promise
,感興趣的朋友可以看我的這篇文章Promise詳解-手寫Promise,實現(xiàn)一款自己的簡易Promise。
感興趣了解Promise
的核心之一的鏈式調用
的朋友可以看我這篇文章Promise 鏈式調用原理-精簡20行代碼。
關于async/await
關于async/await
我們會單獨拿一篇文章來說,感興趣的朋友可以關注我哦,因為當我發(fā)布后你可以更快的看到哦。
總結
以上就是我對async/await
的一個簡單封裝,更多關于await Streaking原理的資料請關注腳本之家其它相關文章!
相關文章
require.js配合插件text.js實現(xiàn)最簡單的單頁應用程序
這篇文章主要介紹了require.js配合插件text.js實現(xiàn)最簡單的單頁應用程序,需要的朋友可以參考下2016-07-07CKEditor 4.4.1 添加代碼高亮顯示插件功能教程【使用官方推薦Code Snippet插件】
這篇文章主要介紹了CKEditor 4.4.1 添加代碼高亮顯示插件功能,涉及ckeditor使用官方推薦Code Snippet插件的相關操作布局與使用注意事項,需要的朋友可以參考下2019-06-06JavaScript實現(xiàn)格式化字符串函數(shù)String.format
本文主要介紹了JavaScript實現(xiàn)格式化字符串函數(shù)String.format(可自動解析引號轉義字符)。具有很好的參考價值,需要的朋友一起來看下吧2016-12-12淺談js繼承的實現(xiàn)及公有、私有、靜態(tài)方法的書寫
下面小編就為大家?guī)硪黄獪\談js繼承的實現(xiàn)及公有、私有、靜態(tài)方法的書寫。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10