詳解如何消除axios攔截中的if
基本攔截
axios的響應(yīng)錯(cuò)誤攔截中,難免會(huì)對(duì)error.status做各種各樣的if判斷,又或者switch。為了防止枯燥乏味的生活(給自己挖坑,換一種姿勢(shì)去寫(xiě)攔截
// 以下大概是日常碰到的操作,攔截響應(yīng),判斷status做相應(yīng)操作
function login () {
console.log('登陸邏輯')
return promise.reject(error)
}
// 添加響應(yīng)攔截器
axios.interceptors.response.use(function (response) {
// 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么
return response;
}, function (error) {
if (error.status === 401) {
// 401重新登錄
console.log('未登陸')
return login(error)
} else if (error.status === 404) {
console.log('404-什么都沒(méi)')
return promise.reject(error)
} else if (error.status === 422) {
console.log(error.response.data.message)
return promise.reject(error)
} else if (error.status === 500) {
console.log('服務(wù)器內(nèi)部錯(cuò)誤')
return promise.reject(error)
} else {
// 其他請(qǐng)求,直接拋出讓業(yè)務(wù)去處理
return promise.reject(error)
}
});設(shè)計(jì)輪子
思考方向
首先思考下怎么實(shí)現(xiàn)這個(gè)東西
- 需要一個(gè)在內(nèi)部消化if的邏輯判斷
- 根據(jù)判斷去執(zhí)行相應(yīng)的邏輯,意味著我們要在內(nèi)部維護(hù)一個(gè)邏輯數(shù)組(以下稱(chēng)為管道數(shù)組),配合成功后即觸發(fā)對(duì)應(yīng)管道。所以在開(kāi)始調(diào)用函數(shù)去執(zhí)行前,先要收集好管道。這個(gè)方法需要傳一個(gè)標(biāo)記(用來(lái)判斷是否匹配)和回調(diào)函數(shù)(匹配成功后的邏輯)
- 除了傳標(biāo)記,需要傳一個(gè)payload(例如攔截中的error)參數(shù),payload可以讓我們?cè)诨卣{(diào)函數(shù)做出更多的對(duì)應(yīng)操作
- 在最后再添加一個(gè)default函數(shù)來(lái)收集匹配失敗后的函數(shù)。
現(xiàn)在,已經(jīng)在心中擬好了一個(gè)小輪子的五臟六腑。
輪子骨架
// 定義個(gè)一個(gè)class
class Enterclose {
constructor () {
// 維護(hù)管道數(shù)組
this.pond = {}
// 默認(rèn)管道
this._default = null
}
/**
* 收集管道
* callback(payload)
* @param {any} sign 標(biāo)記
* @param {Function|Object} callback 回調(diào)函數(shù)|函數(shù)this
* @return this
* */
use (sign, callback) {
return this
}
/**
* 收集匹配失敗的管道
* callback(payload)
* @param {Function} callback 回調(diào)函數(shù)|函數(shù)this
* @return this
* */
default (callback) {
this._default = callback
return this
}
/**
* 執(zhí)行管道流
* @param {any} sign 標(biāo)記
* @param {any} payload
* @return
*/
start (sign, payload) {
}
}詳細(xì)實(shí)現(xiàn)
以上把基本的api骨架寫(xiě)好,然后再一個(gè)一個(gè)慢慢實(shí)現(xiàn)內(nèi)部的邏輯。
首先是use,用來(lái)收集管道,需求中標(biāo)記是唯一的,所以我們的this.ponds的結(jié)構(gòu)是{標(biāo)記: callback}
use (sign, callback) {
this.ponds[sign] = callback
return this
}其中我們需要一個(gè)方法用來(lái)啟動(dòng)Enterclose
通過(guò)getCallback函數(shù)去篩選和標(biāo)記匹配的管道,返回對(duì)應(yīng)的函數(shù)。這樣一個(gè)消除if的小輪子就搞好啦
start (sign, payload) {
const fn = this.getCallback(sign)
if (fn) {
return fn(payload)
}
}
/**
* 根據(jù)標(biāo)記獲取函數(shù)
* @param {*} sign
* @return {Function}
*/
getCallback (sign) {
const key = Object.keys(this.ponds).find(key => key === sign)
if (key) {
return this.ponds[key]
} else if (this._default) {
return this._default
}
}實(shí)踐
創(chuàng)建實(shí)例,用use和default收集管道,然后在攔截中通過(guò)start觸發(fā)判斷
const enterclose = new Enterclose()
// 收集管道
enterclose
.use(401, function (error) {
console.log('未登陸')
return login(error)
})
.use(404, function (error) {
console.log('404-什么都沒(méi)')
return promise.reject(error)
})
.use(429, function (error) {
console.log(error.response.data.message)
return promise.reject(error)
})
.use(500, function (error) {
console.log('服務(wù)器內(nèi)部錯(cuò)誤')
return promise.reject(error)
})
.default(function (error) {
// 收集默認(rèn)管道
return promise.reject(error)
})
axios.interceptors.response.use(function (response) {
// 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么
return response;
}, function (error) {
// 啟動(dòng)
return enterclose.start(error.status, error)
});你也可以根據(jù)自己的場(chǎng)景做一些調(diào)整,例如支持Promise啊,或者說(shuō)加一個(gè)finally函數(shù),每次走管道最后都會(huì)調(diào)用這個(gè)回調(diào)函數(shù)之類(lèi)
總結(jié)
到此這篇關(guān)于如何消除axios攔截中if的文章就介紹到這了,更多相關(guān)消除axios攔截的if內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS實(shí)現(xiàn)求出一個(gè)字符串中最多出現(xiàn)的字符和個(gè)數(shù)
這篇文章主要為大家介紹了字符串中最多的重復(fù)字符的計(jì)算代碼,需要的朋友可以參考下2007-07-07
TypeScript中的類(lèi)型斷言和非空斷言的使用方法
類(lèi)型斷言是一種方式,可以手動(dòng)指定變量的類(lèi)型,非空斷言是一種類(lèi)型斷言的特殊形式,這篇文章主要給大家介紹TypeScript 中的類(lèi)型斷言和非空斷言的使用方法,需要的朋友可以參考下2023-07-07
JavaScript使用二分查找算法在數(shù)組中查找數(shù)據(jù)的方法
這篇文章主要介紹了JavaScript使用二分查找算法在數(shù)組中查找數(shù)據(jù)的方法,較為詳細(xì)的分析了二分查找法的原理與javascript實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-04-04
js 毫秒轉(zhuǎn)天時(shí)分秒的實(shí)例
下面小編就為大家分享一篇js 毫秒轉(zhuǎn)天時(shí)分秒的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
JS 使用 window對(duì)象的print方法實(shí)現(xiàn)分頁(yè)打印功能
這篇文章主要介紹了JS 使用 window對(duì)象的print方法實(shí)現(xiàn)分頁(yè)打印功能,這種方法兼容性比較好,在ie和火狐瀏覽器下都可以正常使用,感興趣的朋友跟隨腳本之家小編一起看看吧2018-05-05
autojs 螞蟻森林能量自動(dòng)拾取即給指定好友澆水的實(shí)現(xiàn)方法
這篇文章主要介紹了autojs 螞蟻森林能量自動(dòng)拾取即給指定好友澆水的實(shí)現(xiàn)方法,本文通過(guò)圖文并茂實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
Bootstrap布局之柵格系統(tǒng)學(xué)習(xí)筆記
這篇文章主要為大家詳細(xì)介紹了Bootstrap布局之柵格系統(tǒng)的學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05

